Полезно ли использовать PHP для демона?

Я хочу создать фоновый процесс, и мне сказали, что они обычно написаны на C или что-то в этом роде. Недавно я обнаружил, что PHP можно использовать для создания демона, и я надеялся получить какой-то совет, если я должен использовать PHP таким образом.

Вот мои требования к демону.

  • Непрерывно проверяйте, добавлена ​​ли строка в таблицу базы данных MySQL.
  • Запустить команды FFmpeg на то, что было извлечено из базы данных
  • Вставка вывода в таблицу MySQL

Я не уверен, что еще я могу предложить, чтобы помочь принять это решение. Просто чтобы добавить, я еще не делал C раньше. Только Java и PHP и базовые сценарии bash.

Разве это даже сильно отличается от производительности?

Пожалуйста, примите мое невежество, я учусь! 🙂

Спасибо всем

Как отмечали другие, различные версии PHP имеют проблемы с их сборщиками мусора. Конечно, если вы знаете, что в вашей версии нет таких проблем, вы устраняете эту проблему. Дело в том, что вы не знаете (наверняка), пока не напишете демона и не пропустите его через valgrind, чтобы проверить, не установлен ли установленный PHP или нет на какой-либо данной машине. Таким образом, с этой стороны вы можете написать это только для того, чтобы узнать, что то, что, по мнению Zend, исправлено, по-прежнему может быть ошибочным, или вы имеете дело со слегка устаревшей версией PHP или некоторым расширением. Icky.

Другая проблема – несколько ошибочные сигналы. По моему опыту, обработчики сигналов не всегда корректно вводятся с PHP, особенно когда сигнал помещается в очередь вместо объединения. Возможно, это не проблема для вас, т. Е. Вам просто нужно обрабатывать SIGINT / SIGUSR1 / SIGUSR2 / SIGHUP.

Поэтому я предлагаю:

Если демон прост, используйте PHP. Если похоже, что он будет довольно сложным или выделяет много памяти, вы можете подумать о написании его в C после его прототипирования в PHP.

Я довольно умный человек. Тем не менее, я не вижу ничего плохого в том, чтобы выталкивать что-то быстро с помощью PHP (за исключением случаев, которые я объяснял). Я также не вижу ничего плохого в использовании PHP для прототипа того, что может быть или не может быть позже переписано в C. Например, обработка данных базы данных будет намного проще, если вы используете PHP, а также управляете обратными вызовами, используя другие интерфейсы в C. Поэтому в этот экземпляр, для «одного выхода», вы наверняка сделаете это намного быстрее.

Я был бы склонен выполнять эту задачу с заданием cron, а не опросом базы данных в демоне.

Вероятно, ваша команда FFmpeg займет некоторое время, чтобы сделать это, не так ли? В этом случае, действительно ли необходимо постоянно проверять базу данных? Не будет ли кроноб, выполняющий каждую минуту (или каждые пять, десять или двадцать минут, если на то пошло), является более простым способом добиться того же самого?

Php не лучше или хуже для такого рода вещей, как любой другой обычный язык сценариев. Он имеет довольно полный доступ ко всем системным вызовам и библиотечным утилитам, которые вам нужны для выполнения такого рода работ. Если вам наиболее удобно использовать PHP для скриптинга, то php выполнит эту работу за вас.

Единственная нижняя сторона заключается в том, что php не такой же вездесущий, как, скажем, perl или python, который устанавливается почти на каждый вкус unix. Php находится только в системах, которые будут обслуживать динамический веб-контент. Не то, чтобы интерпретатор Php слишком большой или дорогостоящий для установки, но если ваша самая большая проблема заключается в получении вашей программы для многих систем, это может быть небольшим препятствием.

Я буду против и рекомендую вам попробовать демона php. Это, по-видимому, язык, который вы знаете лучше всего. Вероятно, вы включите таймер в любом случае, чтобы дублировать частоту запросов в базе данных. На самом деле нет штрафа, если вы не наивно зацикливаете на запросе.

Если это что-то не выполняется часто, вы также можете запустить php из cron, позволяя вашему компьютеру сбрасывать очередь и затем умирать.

Но не бойтесь придерживаться того, что вы знаете лучше всего, в первом приближении.

Старайтесь не использовать триггеры. Они навяжут ненужную связь, и они не интересны для тестирования и отладки.

Работа cron, вероятно, будет работать нормально, если действия почти мгновенного действия не требуются.

Я как раз собираюсь поставить вживую, систему, которую я построил, на основе демонов очереди beanstalkd. Я отправляю различные небольшие сообщения из (в данном случае, PHP) веб-страницы на вызов демону, а затем скрипт PHP вынимает их из очереди и выполняет различные задачи, такие как изменение размера изображений или проверка баз данных (часто передача информации через Memcache на основе хранилища).

Чтобы избежать длительных процессов, я завернул его в скрипт BASH, который в зависимости от значения, возвращаемого из сценария («exit (1);») перезапустит скрипт, для каждого (скажем) 50 задач он выполняется , Если он перезагружается, потому что я планирую его, он сделает это мгновенно, любое другое значение выхода (по умолчанию равно 0, поэтому я не использую это) остановит паузу за несколько секунд до его перезапуска.

Одна из проблем с правильным демонстрацией скрипта PHP заключается в том, что PHP не имеет интерфейсов для системных вызовов dup () или dup2 (), которые необходимы для отсоединения файловых дескрипторов.

Выполняя работу cron с разумно определенной периодичностью, PHP-скрипт может выполнять эту работу, и стабильность производства, безусловно, достижима. Вы можете ограничить количество одновременных экземпляров FFMpeg и обязательно иметь полное ведение журнала приложений и обработку исключений. Я реализовал непрерывно работающие процессы опроса в Java, а также скрипт PHP cron'd каждые десять минут, и оба делают работу хорошо.

Возможно, вам стоит подумать о создании триггера mysql, который выполняет системную команду (то есть FFmpeg) вместо демона. Если некоторое отставание не является проблемой, вы также можете поместить что-то в cron, которое выполняется каждые несколько минут, чтобы проверить. Крон был бы моим выбором, если это вариант.

Чтобы ответить на ваш вопрос, php отлично подходит для работы в качестве демона. Это не нужно делать в C.

Если вы объедините ответы от Kent Fredric, tokenmacguy и Domster, вы получите что-то полезное.

php, вероятно, не подходит для длительных сроков выполнения, поэтому давайте продолжим каждый цикл выполнения и убедитесь, что ОС позаботится об очистке любых папок памяти. В качестве инструмента для запуска скрипта php cron может быть хорошим инструментом. И если вы так делаете, разница между языками невелика.

Однако этот вопрос все еще стоит. Является ли php даже способным работать в качестве нормального демона в течение длительного времени (несколько лет)? Или будет сортировать память, чтобы съесть весь ваш баран и убить систему?

/ Johan

Если вы это сделаете, обратите внимание на утечки памяти. PHP 5.2 имеет некоторые проблемы с его сборщиком мусора, согласно этому (исправлено в 5.3). Возможно, лучше использовать cron, поэтому скрипт начинает очищать каждый прогон.

Для того, что вы описали, я бы пошел с демоном. Убедитесь, что вы спали в цикле опроса, чтобы вы не бомбардировали базу данных, когда нет новых задач. Cronjob работает лучше для рабочих процессов / типов отчетов, где нет определенного события, которое запускает следующий запуск.

Как уже упоминалось, PHP имеет некоторые проблемы с управлением памятью. Вы должны быть уверены, что вы проверите свой код на утечки памяти, так как они будут наращиваться с течением времени в длинном сценарии. PHP не имеет реальной сборки мусора. Он полагается на подсчет ссылок, что означает, что циклические ссылки вызовут утечки. Если вы знаете об этом, вы можете создать код вокруг него.

Если вы решили спуститься по пути демона, есть большой модуль PEAR под названием System_Daemon который я недавно успешно использовал при установке PHP v5.3.0. Это зафиксировано в блоге авторов: http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php

Если у вас установлен PEAR, вы можете установить этот модуль, используя:

 pear install -f System_Daemon 

Вам также потребуется создать скрипт инициализации: /etc/init.d/<your_daemon_name>

Тогда ты можешь:

  • Запустить Daemon: /etc/init.d/projNotifMailDaemon start
  • Stop Daemon: /etc/init.d/projNotifMailDaemon stop

Журналы хранятся по адресу: /var/log/<your_daemon_name>.log

Я бы не рекомендовал его. PHP не предназначен для долговременного выполнения. Он разработан в основном с короткоживущими страницами.

По моему опыту, PHP может иметь проблемы с утечкой памяти для некоторых более крупных задач.

Задача cron и немного сценариев bash должны быть все, что вам нужно, по звукам. Вы можете делать такие вещи, как:

 $file=`mysqlquery -h server < "select file from table;"` ffmpeg $file -fps 50 output.a etc. 

поэтому bash было бы легче писать, порт и поддерживать IMHO, чем использовать PHP.

Если вы знаете, что вы делаете. Вам нужно хорошо понимать вашу операционную систему. PHP обычно не подходит для большинства демонов, потому что он не является потоковым и не имеет приличной системы, основанной на событиях, для всех задач. Однако, если это соответствует вашим потребностям, тогда проблем нет. Современный PHP (5.3+) действительно стабилен и не имеет утечек памяти. Пока вы включаете GC и не выполняете свои собственные утечки памяти и т. Д., Все будет в порядке.

Вот статистика для одного демона, в котором я запускаю: время работы 17 дней (последний перезапуск из-за обновления PHP). байты написаны: 200 ГБ соединений: обработано сотни подключений, обработано сотни тысяч обработанных элементов / запросов: миллионы

node.js, как правило, лучше подходит, хотя и имеет некоторые незначительные раздражения. Некоторые попытки улучшить PHP в тех же областях были сделаны, но они не так уж велики.

Cron job? Да.

Демон, который бежит вечно? Нет.

У PHP нет сборщика мусора (или, по крайней мере, в последний раз, когда я его не проверял). Поэтому, если вы создаете циклическую ссылку, она НИКОГДА не будет очищена – по крайней мере, пока не закончится выполнение основного сценария. В процессе демона это примерно никогда.

Если они добавили GC в новые версии, то да, вы можете.

Действуй. Я тоже должен был это сделать. Как говорили другие, это не идеально, но это будет сделано. С помощью Windows, правильно? Хорошо.

Если вам нужно только время от времени запускать (один раз в час и т. Д.). Сделайте новый ярлык для вашего firefox, поместите его где-нибудь в соответствующее место. Откройте свойства для ярлыка, измените «Цель» на:

 "C:\Program Files\Mozilla Firefox\firefox.exe" http://localhost/path/to/script.php 

Перейдите в Панель управления> Запланированные задачи Настройте новую запланированную задачу на ярлыке.

Если вам нужно, чтобы он выполнялся постоянно или псевдо-постоянно, вам нужно немного приправить скрипт.

Начните свой скрипт с

 set_time_limit(0); ob_implicit_flush(true); 

Если скрипт использует цикл (например, while ), вы должны очистить буфер:

 $i=0; while($i<sizeof($my_array)){ //do stuff flush(); ob_clean(); sleep(17); $i++; } в $i=0; while($i<sizeof($my_array)){ //do stuff flush(); ob_clean(); sleep(17); $i++; }