Разумно ли использовать PHP для демона? - PullRequest
22 голосов
/ 15 марта 2009

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

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

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

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

Имеет ли это даже большую разницу в производительности?

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

Спасибо всем

Ответы [ 17 ]

29 голосов
/ 15 марта 2009

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

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

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

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

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

17 голосов
/ 15 марта 2009

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

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

7 голосов
/ 15 марта 2009

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

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

6 голосов
/ 15 марта 2009

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

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

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

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

4 голосов
/ 17 марта 2009

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

3 голосов
/ 15 марта 2009

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

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

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

2 голосов
/ 15 марта 2009

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

1 голос
/ 15 марта 2009

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

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

1 голос
/ 15 марта 2009

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

1 голос
/ 15 марта 2009

Если вы объедините ответы Кента Фредрика, токенмаггу и Домстера, вы получите что-то полезное.

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

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

/ Johan

...