Запустите php скрипт как процесс демона - PullRequest
144 голосов
/ 10 января 2010

Мне нужно запустить скрипт php как процесс демона (ждать инструкций и делать что-то). Работа cron не сделает это для меня, потому что действия должны быть предприняты, как только прибудет инструкция. Я знаю, что PHP не самый лучший вариант для процессов-демонов из-за проблем с управлением памятью, но по разным причинам мне приходится использовать PHP в этом случае. Я наткнулся на инструмент libslack под названием Daemon (http://libslack.org/daemon), который, кажется, помогает мне управлять процессами демона, но за последние 5 лет не было обновлений, поэтому мне интересно, знаете ли вы какие-нибудь другие альтернативы, подходящие для мой случай. Любая информация будет по достоинству оценена.

Ответы [ 14 ]

1 голос
/ 26 октября 2018

Расширение Эмиль Иваов ответ, Вы можете сделать следующее, чтобы закрыть STDIN, STDOUT И STDERROR в php

if (!fclose(STDIN)) {
    exit("Could not close STDIN");
}

if (!fclose(STDOUT)) {
    exit("Could not close STDOUT");
}

if (!fclose(STDERR)) {
    exit("Could not close STDERR");
}

$STDIN = fopen('/dev/null', 'r');
$STDOUT = fopen('/dev/null', 'w');
$STDERR = fopen('/var/log/our_error.log', 'wb');

По сути, вы закрываете стандартные потоки, так что PHP некуда писать. Следующие fopen вызовы установят стандартный IO на /dev/null.

Я прочитал это из книги Роб Эли - PHP вне Интернета

1 голос
/ 20 мая 2016

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

Я загрузил его на github, не стесняйтесь использовать: https://github.com/sinasalek/EasyDeamonizer

EasyDeamonizer

Просто следит за вашим приложением (запуск, перезапуск, регистрация, мониторинг и т. Д.). универсальный скрипт для проверки правильности работы приложения. Преднамеренно он использует имя процесса instread файла pid / lock, чтобы предотвратить все его побочные эффекты и сделать скрипт как можно более простым и максимально быстрым, поэтому он всегда работает, даже когда перезапускается сам EasyDaemonizer. Особенности

  • Запускает приложение и дополнительно настраиваемую задержку для каждого запуска
  • Обеспечивает работу только одного экземпляра
  • Отслеживает использование ЦП и автоматически перезапускает приложение, когда оно достигает определенного порога
  • Настройка EasyDeamonizer на запуск через cron, чтобы он снова запускался, если по какой-либо причине он был остановлен
  • Журналы своей деятельности
0 голосов
/ 19 октября 2018

Вы можете проверить PM2 здесь, http://pm2.keymetrics.io/

создайте ssh-файл, такой как worker.sh, в ваш php-скрипт, с которым вы будете иметь дело

worker.sh

php /path/myscript.php

запуск демона

pm2 start worker.sh

Ура, вот и все.

0 голосов
/ 30 июля 2017

Я написал и развернул простой php-демон, код доступен здесь

https://github.com/jmullee/PhpUnixDaemon

Особенности: удаление привилегий, обработка сигналов, ведение журнала

Я использовал его в обработчике очереди (сценарий использования: вызвать длительную операцию с веб-страницы, не заставляя php, генерирующий страницу, т.е. запустить асинхронную операцию) https://github.com/jmullee/PhpIPCMessageQueue

...