« А Сбербанк-то, по прежнему Сбербанк | Вывод денег с PayPal на карту Payoneer » |
phpQuery и утечки памяти
Сегодня я не смог залогиниться на свою VPS. На попытки зацепиться по ssh она только хмуро сообщала мне, что соединение сброшено удаленной стороной. Ну и в логах потом нашлось не менее хмурое
sshd[1590]: error: fork: Cannot allocate memory
Собственно, принина нашлась быстро - крутящийся в фоне PHPшный скрипт, занимающийся тем, что перебирает страницы сайта и выдергивает из них нужную инфу. Для такого дела нем применена библиотека phpQuery. Замечательная, надо сказать, штука - порт jQuery на PHP, очень удобно добираться до нужных блоков в дебрях документа. Но есть и подводные камни, вроде как раз того, на который я и нарвался.
В каждом цикле мы разгребаем новый документ, шерстим его, складываем вытащенную инфу и так далее по кругу. Предидущий документ при этом никуда не девается и продолжает занимать память. Разумеется через некоторое время скрипт выжирает все что можно выжрать (или падает, если в PHP включено органичение потребляемой памяти).
Собственно, Решение-то простое - нужно просто освобождать память после обработки документа (Кэп!)
while(true) {
$html = PhpQuery::newDocument($content);
// работаем-работаем-работаем
phpQuery::unloadDocuments();
gc_collect_cycles();
}
gc_collect_cycles, это запуск PHPшного сборщика мусора. Так, на всякий случай. В долгоиграющих скриптах его в любом случае полезно пускать время от времени.
3 комментариев

И от меня: огромное спасибо! Помог!!!
Искал ответ (везде!), примерно 2-3 часа. И только от тебя…