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 'foreach前内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '<br/>'; foreach($arr as $key => $item) { $arr[$key] = $item + 1; if($item % 100000 == 0) { echo 'foreach中内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '<br/>'; } } echo 'foreach后内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '<br/>'; //输出 /* 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 'foreach前内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '<br/>'; foreach($arr as $key => &$item) { $arr[$key] = $item + 1; if($item % 100000 == 0) { echo 'foreach中内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '<br/>'; } }unset($key);unset($item);
순회가 완료된 후 unset($key);unset($item); 배열의 마지막 요소까지, 나중에 이 변수를 수정하면 배열에 직접 수정됩니다. 추천: "
PHP 비디오 튜토리얼"
위 내용은 PHP 프로세스에서 메모리 오버플로를 방지하는 문제 해결의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!