>  기사  >  백엔드 개발  >  PHP 프로세스에서 메모리 오버플로를 방지하는 문제 해결

PHP 프로세스에서 메모리 오버플로를 방지하는 문제 해결

藏色散人
藏色散人앞으로
2020-06-24 13:42:112396검색

PHP 프로세스 메모리 크기는 기본적으로 구성 파일 memory_limit=128M

也可以在程序中动态设置 ini_set('memory_limit', '1024M');这样就设置成1G了。但是一般不会这样设置,毕竟会影响到机器的其他服务。有时候可以排查一下代码,很多时候内存溢出是因为php变量没有及时释放,或者遍历比较大的数组时出现。

1.排查

memory_get_usage() php有这个系统函数,可以得到当前进程使用了多少内存空间。返回是字节单位round(memory_get_usage()/1024/1024, 2).'MB',转换为MB에서 설정할 수 있습니다.

코드 실행 중 메모리 변경 사항을 추적할 수 있습니다.

2. 일반적인 메모리 오버플로 사례

대형 배열을 탐색하고 배열의 일부 값을 수정하면 탐색 프로세스 중에 배열 복사본이 생성됩니다.

PHP 변수의 특징은 "기록 중 복사"입니다.

$arr 배열 할당의 경우 분할되고 새로운 HashTable 구조가 생성되므로 메모리 사용량이 즉시 증가합니다. . 다른 값 순회 및 할당 Variable

$arr = range(0, 599999);
echo &#39;foreach前内存:&#39;.round(memory_get_usage()/1024/1024, 2).&#39;MB&#39;, &#39;<br/>&#39;;
foreach($arr as $key => $item) {
    $arr[$key] = $item + 1;
    if($item % 100000 == 0) {
        echo &#39;foreach中内存:&#39;.round(memory_get_usage()/1024/1024, 2).&#39;MB&#39;, &#39;<br/>&#39;;
    }
}
echo &#39;foreach后内存:&#39;.round(memory_get_usage()/1024/1024, 2).&#39;MB&#39;, &#39;<br/>&#39;;

//输出
/*
foreach前内存:49.9MB
foreach中内存:81.36MB
foreach中内存:84.42MB
foreach中内存:87.47MB
foreach中内存:90.52MB
foreach中内存:93.57MB
foreach中内存:96.62MB
foreach后内存:49.9MB
*/
해결책은 참조 순회를 사용하는 것입니다

$arr = range(0, 599999);
echo &#39;foreach前内存:&#39;.round(memory_get_usage()/1024/1024, 2).&#39;MB&#39;, &#39;<br/>&#39;;

foreach($arr as $key => &$item) {
    $arr[$key] = $item + 1;
    if($item % 100000 == 0) {
        echo &#39;foreach中内存:&#39;.round(memory_get_usage()/1024/1024, 2).&#39;MB&#39;, &#39;<br/>&#39;;
    }
}unset($key);unset($item);

순회가 완료된 후 unset($key);unset($item); 배열의 마지막 요소까지, 나중에 이 변수를 수정하면 배열에 직접 수정됩니다. 추천: "

PHP 비디오 튜토리얼

"

위 내용은 PHP 프로세스에서 메모리 오버플로를 방지하는 문제 해결의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제