Для начала, зачем это вообще надо.
К примеру, у вас есть ресурсоёмкая задача, которая должна выполняться постоянно. Стартовать по 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 готов. Несколько колхозно, зато просто. :)