>백엔드 개발 >PHP 문제 >PHP 메모리 오버플로의 일반적인 원인

PHP 메모리 오버플로의 일반적인 원인

(*-*)浩
(*-*)浩원래의
2019-10-19 08:59:023458검색

메모리 오버플로는 응용 프로그램 시스템에 복구할 수 없는 메모리가 있거나 너무 많은 메모리가 사용되어 궁극적으로 프로그램에서 사용하는 메모리가 가상 머신이 제공할 수 있는 최대 메모리보다 크게 실행되는 것을 의미합니다.

PHP 메모리 오버플로의 일반적인 원인

메모리 오버플로에는 여러 가지 이유가 있으며 일반적인 이유는 다음과 같습니다.

#🎜 🎜 #데이터베이스에서 한 번에 너무 많은 데이터를 가져오는 등 메모리에 로드된 데이터의 양이 너무 많습니다. (권장 학습:

PHP 비디오 튜토리얼)

컬렉션 클래스에 개체 쌍이 있습니다. 사용 후 참조가 지워지지 않습니다.

코드에 무한 루프가 있거나 루프가 너무 많은 중복 개체 엔터티를 생성합니다. #사용된 타사 소프트웨어의 버그;# 🎜🎜#

시작 매개변수 메모리 값이 너무 작게 설정되었습니다.

로그에 저장된 레코드 수가 있다고 가정합니다. 500,000이면 해결 방법은 다음과 같습니다.

# 🎜🎜#

ini_set('memory_limit','64M'); //php가 사용할 수 있는 메모리 크기를 64M으로 재설정합니다. ini 파일은 원격 호스트에서 수정할 수 없으며 프로그램을 통해서만 설정할 수 있습니다. 참고: safe_mode(안전 모드)에서는 ini_set이 유효하지 않습니다

set_time_limit(600);//设置超时限制为6分钟
$farr = $Uarr = $Marr = $IParr = $data = $_sub = array();
$spt = ”$@#!$”;
$root = ”/Data/webapps/VisitLog”;
$path = $dpath = $fpath = NULL;
$path = $root.”/”.date(“Y-m”,$timestamp);
$dpath = $path.”/”.date(“m-d”,$timestamp);
for($j=0;$j<24;$j++){
$v = ($j < 10) ? ”0″.$j : $j;
$gpath = $dpath.”/”.$v.”.php”;
if(!file_exists($gpath)){
continue;
} else {
$arr = file($gpath);////将文件读入数组中
array_shift($arr);//移出第一个单元-》<?php exit;?>
$farr = array_merge($farr,$arr);
unset($arr);
}
}
if(empty($this->farr)){
echo ”<p><center>没有相关记录!</center></p>”;
exit;
}
while(!empty($farr)){
$_sub = array_splice($farr, 0, 10000); //每次取出$farr中1000个
for($i=0,$scount=count($_sub);$i<$scount;$i++){
$arr = explode($spt,$_sub[$i]);
$Uarr[] = $arr[1]; //vurl
$Marr[] = $arr[2]; //vmark
$IParr[] = $arr[3].” |$nbsp;”.$arr[1]; //IP
}
unset($_sub);//用完及时销毁
}
unset($farr);
여기서 한편으로는 PHP의 사용 가능한 메모리 크기를 늘려야 한다는 것을 쉽게 알 수 있습니다. , 배열 일괄 처리를 분할하고, 분할 및 정복하고, 사용된 변수를 시간 내에 파괴(설정 해제)하는 방법을 찾는 한 일반적으로 오버플로 문제는 없습니다.

또한, PHP 프로그램 메모리 소모를 줄이기 위해서는 정적 변수의 사용을 최대한 줄여야 하며, 데이터 재사용이 필요한 경우에는 참조(&) 사용을 고려해 볼 수 있습니다. 또 다른 요점은 데이터베이스 작업이 완료된 후 개체가 사용된 후 즉시 연결을 닫아야 하며 소멸자(__destruct())를 즉시 호출해야 한다는 것입니다.

위 내용은 PHP 메모리 오버플로의 일반적인 원인의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.