2011-01-12 4 views
3

나는 twitter-async 라이브러리를 사용하여 twitter api와 상호 작용합니다. 그러나 다양한 unset() 후 gc_enable()gc_collect_cycles()을 사용하더라도 메모리 제한이 계속 증가합니다.메모리를 지우려면 클래스를 설정하지 마십시오

가비지 수집기를 사용하기 전에 메모리 사용량이 너무 많습니다. 그것은 확실히 많이 감소했습니다. 그러나 만족스럽지 않습니다.

데이터베이스의 새 요청을 확인하고 처리하는 for 루프를 실행 중입니다.

요청이 처리되어 약 98MB (트위터에서 가져 오는 데이터의 양을 고려하면 괜찮습니다)의 메모리를 생성하고 더 이상 처리 할 요청이 없다고 가정하면이 98MB php가 설정 한 260MB 메모리 제한에 도달 할 때까지 데이터가 영구 보존됩니다. 이미 메모리 제한으로 인해 충돌이 발생하면 스크립트를 다시 시작하는 설치 프로그램을 설치했습니다.

조금만 조사한 결과 라이브러리에서 실패한 통화 등의 데이터를 일부 변수에 저장한다는 사실을 발견했습니다. 메모리가 부족한 변수를 모두 없애고 메모리를 절약 할 수있는 클래스 전체를 파괴 할 수있는 방법이 있습니까? 현재 클래스의 변수를 설정 해제 중입니다.

$twitterObj = new EpiTwitter(); 
// Do all the stuff .. 
unset($twitterObj); 

그러나 여전히 메모리 사용에는 변화가 없습니다.

도움말!

답변

1

이 일어날 수 있습니다. 오브젝트가 실제로 소멸되었는지 (실제로 파기 될 때 호출되는지) 확인할 클래스의 소멸자 __destruct()을 정의 할 수 있습니다.

또한 xhprof 또는 xdebug 또는 Zend products과 같은 프로파일 러를 사용하여 메모리 사용을 확인하고 메모리가 낭비되는 부분을 찾을 것을 권장합니다.

+0

나는 이것을 시험하고있다. 곧 업데이트를 게시 할 예정입니다. 그러나 나는 이것이 효과가있을 것이라고 강한 생각을 가지고 있습니다. 그것에 대해 생각해 보았지만 절대로 시도하지 않았습니다.:) – kapeels

1

unset 변수의 설정을 해제합니다. 그것은 즉시 그것을 풀어주지 않습니다. PHP는 자동적으로이를 수행 할 것입니다 - CPU주기가 필요하지 않거나 스크립트가 메모리가 부족할 때까지 늦지 않으려 고합니다. 무엇이든 먼저 발생합니다.

메모리를 즉시 비우려면 변수의 데이터를 다시 작성해야합니다. 이 시도 : 다른 객체 자체 또는 내부의 빅 데이터 중 $twitterObj에 대한 참조를 유지하는 경우

$twitterObj = null; 

+2

$ twitterObj = null은 unset ($ twitterObj) – StasM

+0

@StatM, 감사합니다. 나는 그 점을 확신하지 못했습니다. 제 대답의 첫 부분은 여전히 ​​나타납니다. – Savetheinternet

1

unset은 메모리를 해제하지 않습니다. 변수와 객체 사이의 참조 만 제거합니다. 다른 곳에서 오브젝트에 대한 다른 참조가 없으면 가비지 콜렉터는 다음에 실행될 메모리를 확보합니다. PHP5.3로, 당신은 PHP Manual on Garbage Collection를 참조 대한 자세한 설명은

+0

개체가 어디에서나 참조되고 있는지 어떻게 알 수 있습니까? – kapeels

+0

@KPL http://de.php.net/manual/en/function.debug-zval-dump.php - refcount가있는 경우 참조됩니다. – Gordon

관련 문제