개발! 딱 깔끔하고 센스있게!

왜 이 간단한 php 스크립트가 메모리를 누출합니까? 본문

개발 스크랩 메모/PHP

왜 이 간단한 php 스크립트가 메모리를 누출합니까?

렉사이 2020. 12. 26. 02:42

앞으로 php 프로그램 (drupal 모듈) 에 메모리 유출을 피하기 위해 간단한 php 스크립트를 사용하여 메모리를 누설하고 있습니다.

php 전문가가 이 스크립트를 통해 메모리 사용량이 계속 오르는 원인을 찾아낼 수 있습니까?

자신의 운영을 시도해 각종 인자를 바꾸어 보자.결과가 매우 재미있다.

여기는:

{"member_" . $i} = array("blah blah blha" => 12345); $object->{"membersonly_" . $i} = new StdClass; $object->{"onlymember"} = array("blah blah blha" => 12345); } unset($object); } function waste_a_little_less_memory($iters) { $i = 0; $object = new StdClass; for (;$i < $iters; $i++) { $object->{"member_" . $i} = array("blah blah blha" => 12345); $object->{"membersonly_" . $i} = new StdClass; $object->{"onlymember"} = array("blah blah blha" => 12345); unset($object->{"membersonly_". $i}); unset($object->{"member_" . $i}); unset($object->{"onlymember"}); } unset($object); } memstat(); waste_a_little_less_memory(1000000); memstat(); waste_lots_of_memory(10000); memstat(); 

나에게 수출은:

current memory usage: 73308 current memory usage: 74996 current memory usage: 506676 

[편집은 더 많은 멤버 설치 취소!]

대답

unset() 변수 사용 메모리를 풀 수 없습니다.

‘쓰레기 수집기’(5.3.0 버전 이전에 PHP 는 진정한 쓰레기 수집기가 없었을 뿐 원어에 쓰이는 무메모리 일정)이 적합하다고 생각할 때 메모리가 석방됐다.

또 기술적으로는 unset(), object 변수가 함수의 역할에 한정되지 않기 때문이다.

여기에는 각본이 다른 것을 보여 준다.

나는 memstat () 함수를 수정하였습니다.

{"member_" . $i}= array("blah blah blha" => 12345); $object->{"membersonly_" . $i}= new StdClass; $object->{"onlymember"}= array("blah blah blha" => 12345); } } function object_parent_unset($iters) { $i = 0; $object = new StdClass; for (;$i < $iters; $i++) { $object->{"member_" . $i}= array("blah blah blha" => 12345); $object->{"membersonly_" . $i}= new StdClass; $object->{"onlymember"}= array("blah blah blha" => 12345); } unset ($object); } function object_item_unset($iters) { $i = 0; $object = new StdClass; for (;$i < $iters; $i++) { $object->{"member_" . $i}= array("blah blah blha" => 12345); $object->{"membersonly_" . $i}= new StdClass; $object->{"onlymember"}= array("blah blah blha" => 12345); unset ($object->{"membersonly_" . $i}); unset ($object->{"member_" . $i}); unset ($object->{"onlymember"}); } unset ($object); } function array_no_unset($iters) { $i = 0; $object = array(); for (;$i < $iters; $i++) { $object["member_" . $i] = array("blah blah blha" => 12345); $object["membersonly_" . $i] = new StdClass; $object["onlymember"] = array("blah blah blha" => 12345); } } function array_parent_unset($iters) { $i = 0; $object = array(); for (;$i < $iters; $i++) { $object["member_" . $i] = array("blah blah blha" => 12345); $object["membersonly_" . $i] = new StdClass; $object["onlymember"] = array("blah blah blha" => 12345); } unset ($object); } function array_item_unset($iters) { $i = 0; $object = array(); for (;$i < $iters; $i++) { $object["member_" . $i] = array("blah blah blha" => 12345); $object["membersonly_" . $i] = new StdClass; $object["onlymember"] = array("blah blah blha" => 12345); unset ($object["membersonly_" . $i]); unset ($object["member_" . $i]); unset ($object["onlymember"]); } unset ($object); } $iterations = 100000; memdiff(); // Get initial memory usage object_item_unset ($iterations); memdiff(); object_parent_unset ($iterations); memdiff(); object_no_unset ($iterations); memdiff(); array_item_unset ($iterations); memdiff(); array_parent_unset ($iterations); memdiff(); array_no_unset ($iterations); memdiff(); ?> 

사용 대상이 된다면 이러한 종류가 unset(), unset()을 허용하여 자원을 삭제할 수 있도록 확인하십시오.가변구조류를 최대한 사용하지 않기 (예를 들어 stdclass) 이나 클래스에 분배할 때 존재하지 않는 멤버는 이 멤버들의 메모리에 배당되지 않기 때문이다.

PHP 5.3.0과 더 높은 버전은 더 좋은 쓰레기수집기가 있지만 기본적으로 사용되지 않습니다.

사용하려면 gcu enable () 한 번 호출해야 합니다.

Comments