Задать вопрос

Ещё раз про асинхронный вызов фунции на php?

Я хочу вызвать во время работы скрипта функцию так, чтобы скрипт не ждал, пока она завершится:

$html = curl_multi_getcontent($curl); // вот тут я получаю результат операции
$info = curl_getinfo($curl); // вот тут  - информацию об операции

process_resault($html, $info); // ВОТ ЭТА ФУНКЦИЯ будет работать минут десять, обработает результат, запишет его в базу, я НЕ ХОЧУ ЖДАТЬ ЕЁ ЗАВЕРШЕНИЯ

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

Т.е. задача — вызвать произвольную функцию с параметрами и, не ожидая её завершения, продолжить работу.


В первую очередь, интересует кросс-платформенное решение.


Знаю, что статьи на тему были, но ответа на свой вопрос я так и не нашел. Не пинайте сильно.


Заранее спасибо!
  • Вопрос задан
  • 9389 просмотров
Подписаться 7 Оценить Комментировать
Решения вопроса 1
DevMan
@DevMan
Используйте очередь задач (хоть готовую, хоть свою). Это будет намного проще придумывания костылей и кросс-платформенно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
@aleks_raiden
Например, gearman
Ответ написан
kuzemchik
@kuzemchik
Мы используем Jenkins, с помощью curl дергаем задачу с параметрами, и она дальше работает. Логи jenkins имеет, за очередями сам следит.
Ответ написан
Wott
@Wott
В общем случае вам надо запустить эту функцию в отдельном процессе/нити, только тогда она будет выполнятся независимо ( с обычными оговорками, но все же )
Как именно это делать — это вопрос. Выше предлагают держать отдельные процессы, которые подхватят задание из очереди. Есть еще стандартный расширение pcntl, которое реализует стандартный unix механизм fork для создания дочернего процесса, но он не работает на виндах, например, в силу того что там это организовано по-другому.
Дополнительно есть особенности с работой php в веб-сервере с set_time_limit().

Когда мне надо было сделать какие-то долгие задачи, я делал фактически демон в bg и работал с ним через разные интерфейсы — то очередь через базу, то REST, что прикольней.
Ответ написан
Комментировать
В php есть lib_events, но дела я с ней не имел и могу ошибаться в ее предназначение под вашу задачу.
Ответ написан
Комментировать
EugeneOZ
@EugeneOZ
Вот Вам моя php-библиотека для создания отложенных задач:
github.com/jamm/Tasks. Не требует ничего, кроме PHP. Может хранить в памяти, если захотеть (Redis, Memcached, APC).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы