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

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

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

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

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

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

Пожалуйста, позвольте моему невежеству, я учусь!:)

Спасибо всем

Ответ 1

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

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

Итак, я предлагаю:

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

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

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

/Johan

Ответ 10

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

Ответ 11

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

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

Ответ 12

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

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

pear install -f System_Daemon

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

Затем вы можете:

  • Начать демон: /etc/init.d/projNotifMailDaemon start
  • Stop Daemon: /etc/init.d/projNotifMailDaemon stop

Журналы хранятся в: /var/log/<your_daemon_name>.log

Ответ 13

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

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

Ответ 14

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

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

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

Ответ 15

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

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

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

Ответ 16

Работа в Cron? Да.

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

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

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

Ответ 17

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

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

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

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

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

Запустите script с помощью

set_time_limit(0);
ob_implicit_flush(true);

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

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