Как на PHP реализовать беспрерывное выполнение задачи?

Здравствуйте! Есть некая задача (бесконечный цикл), которая должна выполняться беспрерывно.
Вариант с запуском по крону не подходит, т.к. нельзя предугадать, сколько будет выполняться часть задачи.
Само приложение на Laravel, поэтому думаю задействовать механизм очередей и Artisan. Но если что-то случится в процессе выполнения, то очередь прервется.
Как поступить? Думаю копать в направлении PhpDaemon, но не имею малейшего представления, как это работает.
  • Вопрос задан
  • 4725 просмотров
Решения вопроса 2
$file='/tmp/parser_status.lock';
if(!flock($lock_file = fopen($file, 'w'), LOCK_EX | LOCK_NB))
  die("Already runninng\n");

В начала файла. И на крон каждую минуту..
Если что-то пойдет не так, блокировка снимется и запустится новый скрипт.

Костыль конечно, но работает уже несколько лет :)
Ответ написан
Комментировать
@Von_Der_Shulenburg
Вот так, например
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
OAPrilepa
@OAPrilepa
frontend разработчик
А такой вариант не подойдет?
<?php
set_time_limit(0);
while (true) { ... }
Ответ написан
AloneCoder
@AloneCoder
[object Object]
Да, тогда вам нужен демон, копайте в сторону pcntl_fork() и примеров его использования
Ответ написан
Комментировать
sck_v
@sck_v
exflow.io
Просто по окончании выполнения программы, в программе же, добавляете её же в очередь

Так:
do_really_hard_work(params)
queue.enqueue(_FILE_)


Вам остаётся только один раз запустить её. Ну и придумать, как остановить
Ответ написан
Комментировать
shushu
@shushu
А почему крон не подойдёт ?

При запуске скрипта прверяем или лок файл существует (наличие файлика где то в /tmp)
Если нету - то создаем его и продолжаем стандартное выполнение скрипта.
В конце скрипта удаляем файлик.

Если есть - значит процесс всё еще выполняется, поэтому остонавливаем текущее выполнение скрипта.
Ответ написан
У меня работает php процесс на бесконечном цикле, хватающий задачи из gearman'а.

monit следит за тем, чтобы процесс не отвалился, и перезапускает его в случае чего. По умолчанию свои проверки monit выполняет раз в минуту – в таком случае это решение вряд ли лучше более простого способа, предложенного @L3n1n
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы