2011-01-12 5 views
3

Я использую библиотеку twitter-async для взаимодействия с twitter api. Однако ограничение памяти продолжает увеличиваться, даже если я использую gc_enable() и gc_collect_cycles() после различных unset() sОтключение класса для очистки памяти

Перед использованием сборщика мусора использование памяти было слишком большим. Это, безусловно, уменьшилось. Но не удовлетворительно.

Я запускаю цикл for, который проверяет новые запросы в базе данных и обрабатывает их.

Предположим, что запрос обрабатывается, генерируя около 98 МБ (это нормально - учитывая объем данных, которые я извлекаю из твиттера) памяти, и больше нет запросов для обработки, тогда этот 98 МБ данных будет оставаться навсегда, пока php не достигнет предела памяти 260 МБ, который у меня установлен. Я уже установил monit, который перезапускает скрипт, если он сбой из-за ограничения памяти.

После некоторого изучения я обнаружил, что библиотека сохраняет данные о неудачных вызовах и т. Д. В некоторых переменных. Есть ли способ, с помощью которого я могу уничтожить весь класс, который отключит все переменные памяти и сохранит память? В настоящее время я просто не задал() переменную для класса.

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

Но по-прежнему нет никаких изменений в использовании памяти.

Помощь!

ответ

1

Это может произойти, если какой-либо другой объект сохраняет ссылку на любой $twitterObj сам или некоторые большие данные внутри него. Вы можете определить деструктор __destruct() для класса, чтобы увидеть, действительно ли объект уничтожен (он вызывается при фактическом уничтожении).

Я бы также рекомендовал использовать профилировщик - например, xhprof или xdebug или Zend products - чтобы увидеть использование памяти и найти место, где пропала память.

+0

Я пробую это. Скоро опубликует обновление. Но у меня есть сильное чувство, что это сработает. Если бы подумал об этом, но сам не пробовал.:) – kapeels

1

unset только делает то, что он говорит: unset the variable. Он не сразу освобождает его. PHP сделает это позже автоматически - по желанию, как только эти циклы процессора не нужны, или еще до того, как скрипт закончится из памяти; прежде всего.

Для немедленной освобождения памяти вам потребуется переписать данные переменной. Попробуйте это:

$twitterObj = null; 

+2

$ twitterObj = null будет делать то же самое, что и unset ($ twitterObj) – StasM

+0

@StatM, спасибо. Я не был в этом уверен. Первая часть моего ответа все еще стоит. – Savetheinternet

1

unset не освобождает память. Он удалит только ссылку между переменной и объектом. Сборщик мусора освободит память при следующем запуске, если нет других ссылок на объект в другом месте. По состоянию на PHP5.3, вы можете заставить gc'ing по телефону

Для более подробного объяснения см PHP Manual on Garbage Collection.

+0

Как найти, где объект ссылается где угодно? – kapeels

+0

@KPL С http://de.php.net/manual/en/function.debug-zval-dump.php - если у него есть пересчет, это ссылка – Gordon

Смежные вопросы