Демоны на PHP

Для начала, зачем это вообще надо.
К примеру, у вас есть ресурсоёмкая задача, которая должна выполняться постоянно. Стартовать по cron — хорошая идея, но вот только запуская это мы вполне себе можем уткнуться в timeout error. Неприятно. Дабы избежать этого, можно всё завернуть в PHP-демона.

Самое простое решение:
1. Создаём два файла control.php и demon.php
2. demon.php создает lock-файл с номером своего процесса
3. Запускаем и останавливаем демона через control.php

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

Естественно, обычный хостинг не подойдет. Нужна площадка, на которой призывать запускать демонов разрешено. VPS/VDS. Кстати, их можно очень вкусно приобрести на IHC.

Наш демон будет запускаться через браузер, при помощи GET-запроса. Конечно, это не безопасно, но кому сейчас легко )

Содержимое файла control.php:

<?php
if (isset($_GET['action'])) {
    $dir = realpath(__DIR__); //получаем путь до директории в которой сейчас сидим
    if ($_GET['action'] === 'stop') {
        $pid = file_get_contents($dir.'/demon.lock'); //получаем process id из нашего lock-файла
        exec("kill -9 ".$pid); //убиваем процесс через команду килл
        unlink($dir.'/demon.lock'); //убиваем файл демона
        exit('demon stopped'); //пишем, что демоны изгнаны
    }

    if ($_GET['action'] === 'start') {
        if (!file_exists($dir.'/demon.lock')) { //проверяем, если демон не запущен, тогда
            exec("/usr/bin/php $dir/demon.php > /dev/null &"); //запускаем демона
            exit('demon started'); //пишем, что демоны призваны
        }
    }
}
exit('error'); // если ниче не произошло, значит что-то пошло не так, отправляем ошибку

Содержимое файла demon.php, здесь будет основа для нашего демона на PHP:

<?php

    $dir = realpath(__DIR__); //получаем путь до папки
    file_put_contents($dir.'/demon.lock',getmypid()); //записываем номер процесса в лок-файл

    while (true) { //запускаем бесконечный цикл
        //здесь всякие демонические действия
    }

Складываем это в какую-нибудь папку, например, в корень localhost. запускаем:
http://localhost/control.php?action=start

Не забываем проверить, появился ли файл demon.lock после призыва старта нашего демона. Если всё отлично, останавливаем:
http://localhost/control.php?action=stop

Готово, самый простой в мире демон на PHP готов. Несколько колхозно, зато просто. 🙂