PHP 메모리 누수가 발생하면 어떻게 되나요?

王林
풀어 주다: 2023-02-24 14:12:02
원래의
3328명이 탐색했습니다.

PHP 메모리 누수가 발생하면 어떻게 되나요?

상황 1. 프로그램 운영 데이터가 너무 큽니다

시나리오 복원 : PHP의 사용 가능한 메모리 한도를 한 번에 초과하는 데이터를 읽으면 메모리가 소모됩니다

<?php
ini_set(&#39;memory_limit&#39;, &#39;128M&#39;);
$string = str_pad(&#39;1&#39;, 128 * 1024 * 1024);
로그인 후 복사

Solution:

#🎜🎜 #1, 돈으로 해결할 수 있는 문제는 문제가 아닙니다. 프로그램이 대용량 파일을 읽을 기회가 많지 않고 상한이 예측 가능하다면 ini_set('memory_limit', '1G'); 더 큰 값 또는 memory_limit=- 1. 메모리가 충분하면 프로그램을 계속 실행할 수 있습니다.

2. 프로그램을 작은 메모리 머신에서 정상적으로 사용할 수 있어야 한다면 프로그램을 최적화해야 합니다. 아래에 표시된 것처럼 코드가 훨씬 더 복잡해졌습니다.

<?php
 //php7 以下版本通过 composer 引入 paragonie/random_compat ,为了方便来生成一个随机名称的临时文件 
require "vendor/autoload.php";
 ini_set(&#39;memory_limit&#39;, &#39;128M&#39;); 
//生成临时文件存放大字符串 
$fileName = &#39;tmp&#39;.bin2hex(random_bytes(5)).&#39;.txt&#39;; touch($fileName);

for ( $i = 0; $i < 128; $i++ ) {    
    $string = str_pad(&#39;1&#39;, 1 * 1024 * 1024);
    file_put_contents($fileName, $string, FILE_APPEND); 
} 
$handle = fopen($fileName, "r"); 
for ( $i = 0; $i <= filesize($fileName) / 1 * 1024 * 1024; $i++ ) {   //do something   
    $string = fread($handle, 1 * 1024 * 1024); 
} 
fclose($handle); 
unlink($fileName);
로그인 후 복사

사례 2, 빅데이터를 기반으로 프로그램을 실행할 때 복사본이 생성됩니다#🎜🎜 ##🎜🎜 #시나리오 복원: 실행 중 큰 변수가 복사되어 메모리가 부족했습니다.

<?php 
ini_set("memory_limit",&#39;1M&#39;); 
$string = str_pad(&#39;1&#39;, 1* 750 *1024); 
$string2 = $string; 
$string2 .= &#39;1&#39;;
로그인 후 복사

해결책:

쓸데없는 변수를 조기에 해제하거나 원본 데이터를 참조 형식으로 조작하세요.

<?php 
ini_set("memory_limit",&#39;1M&#39;); 
$string = str_pad(&#39;1&#39;, 1* 750 *1024); 
$string2 = $string; 
unset($string); 
$string2 .= &#39;1&#39;;
로그인 후 복사

시나리오 3,

불합리한 구성 시스템 자원 고갈

시나리오 복원: 불합리한 구성으로 인해 결과적으로 메모리가 충분하지 않습니다. 2G 메모리 시스템에서 시작할 수 있는 최대 php-fpm 하위 프로세스 수는 100개이지만 실제로 50개의 php-fpm 하위 프로세스를 시작한 후에는 더 이상 프로세스를 시작할 수 없습니다. #🎜🎜 ##### 🎜🎜#Solution:#🎜🎜 ## 🎜🎜 ## 🎜🎜##Tere set_max_size, max_file_uploads, upload_max_filesize, max_input_vars Vel 및 기타 매개변수를 설정하고 PHP-FPM 관련 매개변수를 조정합니다.

상황 4.

쓸데없는 데이터가 제때 공개되지 않음

시나리오 복원: 이 문제는 프로그램 로직 측면에서는 문제가 되지 않지만, 쓸모없는 데이터가 많은 양의 메모리를 차지하므로 코드를 목표한 방식으로 최적화해야 합니다.

다음 코드는 Laravel 개발에서 데이터베이스 작업을 모니터링하는 데 사용됩니다:

DB::listen(function ($query) {            
// query−>sql//query−>sql//query->bindings            
// $query->time        });
로그인 후 복사
Solution: # 🎜 🎜#이 예제에서는 실행된 모든 SQL 문 레코드를 가져와 로그에 기록하기 위해 DB::listen 메서드를 사용해야 합니다. 그러나 이 메서드는 개발 환경에서는 문제가 되지 않습니다. 프로덕션 환경에서는 실행된 SQL 문을 얻고 로그를 작성하는 다른 방법을 비활성화하고 대신 사용해야 합니다.

추천 튜토리얼

PHP 비디오 튜토리얼

위 내용은 PHP 메모리 누수가 발생하면 어떻게 되나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿