linux — управление демоном php

Как я могу управлять своим демоном из Интернета, не меняя простое время выполнения cli на php-fpm?

Демон запускается автоматически после запуска ОС и работает как cli-приложение без пула php-fpm. Поэтому основная идеология экосистемы демонов — работать без пула php-fpm (CLI-SAPI).

Конфигурация сервера:

  1. Debian 7
  2. Apache 2.2
  3. php5-fpm (v 5.4.35) — mod_fastcgi
  4. daemon.php
  5. daemon_manager.php — сценарий управления для запуска | остановки | перезапуска | уничтожения daemon.php из командной строки.
  6. daemon_manager_web.php — скрипт администратора для управления демоном из браузера.

daemon.php — это обычный демон php:

<?php
declare(ticks=1);
ini_set("max_execution_time", "0");
ini_set("max_input_time",     "0");
set_time_limit(0);
/* Catching signals */
function sig_handler($signo) {
switch ($signo) {
case SIGQUIT:
case SIGTERM:
// some work
pcntl_wait($status);
break;
//...
}
}

pcntl_signal(SIGTERM, 'signal_handler');
pcntl_signal(SIGQUIT, 'signal_handler');

$newpid = pcntl_fork();
if ($newpid == -1) {
throw new Exception('Cannot fork porcess');
} elseif ($newpid) {
print "Starting daemon under pid=$newpid\n";
// ...
exit;
}

Эта проблема.

Поскольку PCNTL-функции недоступны из Интернета, я управляю демоном с помощью таких функций, как exec (), shell_exec (). Но когда я останавливаюсь и снова запускаю демон с помощью daemon_manager_web.php из браузера, он обычно запускается, но работает в пуле php-fpm.

Список процессов перед перезапуском:

$ ps aux | grep php
root      5952  0.0  2.9  69008 14952 pts/0    S    14:24   0:00 php /var/www/daemon.php

$ service php5-fpm status
php5-fpm.service - LSB: starts php5-fpm
Loaded: loaded (/etc/init.d/php5-fpm)
Active: active (running) since Fri, 05 Dec 2014 11:28:25 +0200; 11h ago
Process: 1003 ExecStart=/etc/init.d/php5-fpm start (code=exited, status=0/SUCCESS)
CGroup: name=systemd:/system/php5-fpm.service
├ 1627 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
├ 9562 php-fpm: pool www
├ 9605 php-fpm: pool www
└ 9633 php-fpm: pool www

Список процессов после перезапуска из браузера:

$ service php5-fpm status
php5-fpm.service - LSB: starts php5-fpm
Loaded: loaded (/etc/init.d/php5-fpm)
Active: active (running) since Fri, 05 Dec 2014 11:28:25 +0200; 11h ago
Process: 1003 ExecStart=/etc/init.d/php5-fpm start (code=exited, status=0/SUCCESS)
CGroup: name=systemd:/system/php5-fpm.service
├ 1627 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
├ 4987 php-fpm: pool www
├ 5040 php-fpm: pool www
├ 9432 php-fpm: pool www
└ 9492 /usr/bin/php /var/www/daemon.php

4

Решение

Вам следует не запустить демон через Apache любым способом. Правильный способ сделать это — запустить демона как такового (под управлением, скажем, supervisord, У меня есть довольно хороший послужной список, использующий это в производстве) и открытие файлового сокета (AF_UNIX) на котором вы делаете socket_select() и ожидание некоторого ввода, который запускает обработку. Таким образом, «интерфейс» (на Apache) просто подключается к сокетам и пишет в него.

По этой теме, я считаю, что написание демонов в PHP довольно утомительно, и вы можете выбрать библиотеку для обработки мелочей для вас (не могу рекомендовать какую-либо) или даже другой инструмент, более подходящий для цикла событий, типичного для демонов. (Node.js?)

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector