Срок работы пробной версии продукта истек. Через две недели этот сайт полностью прекратит свою работу. Вы можете купить полнофункциональную версию продукта на сайте www.1c-bitrix.ru. Реализация простого демона на PHP

Реализация простого демона на PHP

Реализация простого демона на PHP

Начнем с того, что попробуем понять что же такое PHP демоны? Демон - это программа в системах класса UNIX, запускаемая самой системой и работающая в фоновом режиме без прямого взаимодействия с пользователем. Если это понятие применить к нашей задаче, т.е. к языку программирования PHP, то можно сделать следующие выводы:

  1. Демон - это обычный PHP скрипт выполняемый интерпретатором.
  2. PHP демон работает на сервере в фоновом режиме и не взаимодействует на прямую с пользователем.

Каркас однопроцессорного демона на PHP

Для реализации демона на php нам понадобится расширение PCNTL. Данное расширение дает возможность управлять запущенными процессами. Убедились, что данное расширение присутствует на Вашем VDS / VPS? Тогда рассмотрим каркас простейшего демона.

$stop = false;
/**
 * pcntl_fork() - данная функция разветвляет текущий процесс
 */
$pid = pcntl_fork();
if ($pid == -1) {
    /**
     * Не получилось сделать форк процесса, о чем сообщим в консоль
     */
    die('Error fork process' . PHP_EOL);
} elseif ($pid) {
    /**
     * В эту ветку зайдет только родительский процесс, который мы убиваем и сообщаем об этом в консоль
     */
    die('Die parent process' . PHP_EOL);
} else {
    /**
     * Бесконечный цикл
     */
    while(!$stop) {
        /*
         * Тело демона
         */
    }
}
/**
 * Установим дочерний процесс основным, это необходимо для создания процессов
 */
posix_setsid();

Весь код сводится к тому, чтобы после запуска распараллелить скрипт и завершить родительский процесс, тем самым отвязаться от консоли и уйти в фон. Для того, чтобы наш демон не закончился раньше времени, необходимо его пустить в бесконечный цикл, но стоит оставить возможность нормального завершения работы. Рассмотрим более подробно.

Бесконечный цикл реализован при помощи конструкции while и переменной $stop. Данная переменная нам необходима для корректного завершения процесса, например, так:

...
    while(!$stop) {
        /*
         * Тело демона
         */
        for ($i = 0; $i < 10; $i++) {
            file_put_contents('/var/data/tmp/' . $i . '.txt', time());
            sleep(2);
        }
        //Завершим корректно выполнение демона
        $stop = true;
    }
...

В данном примере демон за 20 секунд создает 10 файлов и присваивает переменной $stop значение true, на следующей итерации бесконечный цикл while прекратится и программа завершит работу. В данном совете мы рассмотрели однопроцессорный демон на языке программирования PHP, теперь рассмотрим задачи, где он нам может понадобиться.

Запуск PHP демона

Для запуска подключаемся по SSH и запускаем скрипт:

/usr/bin/php /var/data/deamon.php & >/dev/null

Примеры задач

  • Выполнение трудоемких расчетов, например, перерасчет рейтингов в большой базе.
  • Конвертация видеофайлов, например, после загрузки файла на сервер добавляем его в очередь на конвертацию, демон в фоне смотрит появление новых заданий и выполняет их.
  • Парсер данных - тут очень большое "поле" применения данных, начиная с банального копирования контента, заканчивая автоматическим составлением каталогов товара или других данных.
  • Автоматические голосовалки - накрутка голосов, например, в конкурсах.
  • Автоматическая регистрация почтовых ящиков и учетных записей на сайтах.
  • Пауки - обход сайтов.
  • И множество других задач...

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

 5268 PHP, Демон, Code snippet
20 апреля 2015
Команда BXCert

Наша команда разрабатывает портал BXCert, а также занимается разработкой сайтов на CMS 1С-Битрикс. Все участники являются сертифицированными специалистами Bitrix.

Возможно Вам будет интересно

Комментарии

Миха Васильев 06 мая 2015 в 23:23 / # / Ответить
Полезно! Но! Было бы интересно более детально разобрать тематику, например, разобрать как сделать парсер.
Команда BXCert 07 мая 2015 в 09:25 / # / Ответить
Спасибо!
Постараемся подготовить материал по простому парсеру сайтов.
Антон Лирник 09 декабря 2015 в 02:18 / # / Ответить
Подскажите пожалуйста я работою напрямую на хостинге. Как сделать запуск файла deamon.php например из другого php файла.
Команда BXCert 09 декабря 2015 в 09:58 / # / Ответить
Можно попробовать запустить через функцию exec.
PHP функция exec() исполняет команду. Получится что-то такое:
exec('php deamon.php > /dev/null');
Чтобы оставлять комментарии необходимо зарегистрироваться и пройти авторизацию.