Intereting Posts
php – получить числовой индекс ассоциативного массива Справочный массив PHP по нескольким индексам Неустранимая ошибка: вызов функции-члена fetchAll () для не-объекта в pdo Doctrine Paginator выбирает всю таблицу (очень медленно)? 64-разрядная версия Linux / Ubuntu и openssl (не удалось прочитать символы: Плохое значение) Показывать видеоролики YouTube только для пользователей сайта file_exists () слишком медленный в PHP. Может ли кто-нибудь предложить более быструю альтернативу? Открыть pdf-файл в файле fpdf и вернуть его содержимое Как управлять «пейджингом» с помощью Solr? Подсчитайте данные в массиве, где дата одинакова и постройте диаграмму bar morrisjs Невозможно установить композитор из-за проблем с сертификатами MYSQLI_NUM_ROWS ВСЕГДА ВОЗВРАЩЕНИЕ 0 Запуск PHP: невозможно загрузить динамическую библиотеку, Windows, Apache 2.2, php 5.2.11 API Gmail: 400 плохих запросов при попытке отправить электронное письмо (код PHP) preg_replace \ n в строке

php daemon возможна утечка памяти

я написал демона в 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 для предотвращения проблем с круговыми ссылками.

  • gc_enable ()
  • gc_collect_cycles ()

Вы не должны использовать PHP для написания демона . Зачем? Поскольку PHP не является языком, достаточно зрелым, чтобы работать в течение нескольких часов, дней, недель или месяцев. PHP написан на C, все магии, которые он предоставляет, должны обрабатываться. Сбор мусора, в зависимости от вашей версии, может работать или не работать, в зависимости от того, какие расширения вы скомпилировали и использовали. Да, если они поставляются с официальными релизами, они должны «играть хорошо», но вы проверяете, какой выпуск вы используете? Вы уверены, что все загруженные расширения понимают, что они могут работать более 10 – 30 секунд? Учитывая, что большинство случаев выполнения никогда не обнаруживают утечек, уверены ли вы, что они даже работают?

Я довольно близок к тому, чтобы « не использовать регулярное выражение для разбора HTML-rant » по этому поводу, поскольку я вижу, что вопрос все больше и больше возникает. Дважды сегодня, о которых я знаю.

Вы бы использовали лом в качестве зубочистки? Ни Zend, ни Roadsend, ни PHC недостаточно зрелые, чтобы обрабатывать работу в течение любого периода времени, который можно было бы считать затяжным, учитывая ожидаемый срок службы PHP при рендеринге веб-страницы. Да, даже с возможностями GC, предоставляемыми компилятором PHP на основе C ++, неразумно писать демона в PHP.

Я ненавижу ответы, которые говорят, что you can't do that, with that , но в этом случае это правда, по крайней мере на данный момент.