я написал демона в php и хочу убедиться, что он не течет из памяти, так как он будет работать 24/7.
даже в его простейшей форме memory_get_peak_usage для демона сообщит, что сценарий потребляет больше памяти для каждого цикла. memory_get_usage, с другой стороны, не будет расти.
вопрос: должен ли я беспокоиться? я лишил демона до простых основ, но это все еще происходит. Есть предположения?
#!/usr/bin/php -q <?php require_once "System/Daemon.php"; System_Daemon::setOption("appName", "smsd"); System_Daemon::start(); while(!System_Daemon::isDying()){ System_Daemon::info("debug: memory_get_peak_usage: ".memory_get_peak_usage()); System_Daemon::info("debug: memory_get_usage: ".memory_get_usage()); System_Daemon::iterate(2); }
ЗАКЛЮЧИТЕЛЬНАЯ ЗАПИСКА + ЗАКЛЮЧЕНИЕ: я закончил тем, что написал свою собственную оболочку демона, а не использовал system_daemon груши. независимо от того, как я настраивал эту библиотеку, я не мог остановить ее от утечки памяти. надеюсь, это поможет кому-то другому.
ЗАКЛЮЧИТЕЛЬНОЕ ЗАМЕЧАНИЕ + ЗАКЛЮЧЕНИЕ 2: мой скрипт работает уже более недели и до сих пор не просачивается 1 байт памяти. так что написать демона в php на самом деле, кажется, все в порядке, если вы очень осторожно относитесь к его потреблению памяти.
У меня та же проблема. Возможно, лучшая идея – сообщить о новой ошибке в PEAR
Кстати, код вроде этого не показывает, что memleak:
#!/usr/bin/php -q <?php require_once "System/Daemon.php"; System_Daemon::setOption("appName", "smsd"); System_Daemon::start(); while(!System_Daemon::isDying()) { print ("debug: memory_get_peak_usage: ".memory_get_peak_usage()."\n"); print ("debug: memory_get_usage: ".memory_get_usage()."\n\n"); System_Daemon::iterate(2); }
Похоже, System_Daemon :: info () – проблема.
Оказывается, file_get_contents
– это утечка памяти. Всякий раз, когда я отключил эту линию, пиковое использование памяти было стабильным. Когда я прокомментирую это, использование максимальной памяти увеличится на 32 байта на каждой итерации.
Заменил вызов file_get_contents
(используемый для извлечения числа внутри pid-файла в / var / run) с помощью fread
и решил эту проблему.
Этот патч будет частью следующей версии System_Daemon .
Спасибо, кто (не может найти подходящий ник) также сообщил об этой ошибке ( # 18036 ), иначе я бы, вероятно, никогда не знал.
Еще раз спасибо!
Вы можете попробовать использовать новый сборщик мусора в PHP 5.3 для предотвращения проблем с круговыми ссылками.
Вы не должны использовать PHP для написания демона . Зачем? Поскольку PHP не является языком, достаточно зрелым, чтобы работать в течение нескольких часов, дней, недель или месяцев. PHP написан на C, все магии, которые он предоставляет, должны обрабатываться. Сбор мусора, в зависимости от вашей версии, может работать или не работать, в зависимости от того, какие расширения вы скомпилировали и использовали. Да, если они поставляются с официальными релизами, они должны «играть хорошо», но вы проверяете, какой выпуск вы используете? Вы уверены, что все загруженные расширения понимают, что они могут работать более 10 – 30 секунд? Учитывая, что большинство случаев выполнения никогда не обнаруживают утечек, уверены ли вы, что они даже работают?
Я довольно близок к тому, чтобы « не использовать регулярное выражение для разбора HTML-rant » по этому поводу, поскольку я вижу, что вопрос все больше и больше возникает. Дважды сегодня, о которых я знаю.
Вы бы использовали лом в качестве зубочистки? Ни Zend, ни Roadsend, ни PHC недостаточно зрелые, чтобы обрабатывать работу в течение любого периода времени, который можно было бы считать затяжным, учитывая ожидаемый срок службы PHP при рендеринге веб-страницы. Да, даже с возможностями GC, предоставляемыми компилятором PHP на основе C ++, неразумно писать демона в PHP.
Я ненавижу ответы, которые говорят, что you can't do that, with that
, но в этом случае это правда, по крайней мере на данный момент.