메모리 오버플로는 응용 프로그램 시스템에 복구할 수 없는 메모리가 있거나 너무 많은 메모리가 사용되어 궁극적으로 프로그램에서 사용하는 메모리가 가상 머신이 제공할 수 있는 최대 메모리보다 크게 실행되는 것을 의미합니다.
메모리 오버플로에는 여러 가지 이유가 있으며 일반적인 이유는 다음과 같습니다.
#🎜 🎜 #데이터베이스에서 한 번에 너무 많은 데이터를 가져오는 등 메모리에 로드된 데이터의 양이 너무 많습니다. (권장 학습: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 중국어 웹사이트의 기타 관련 기사를 참조하세요!