PHP Запуск фоновых заданий без ожидания ответа Неблокирующий режим, такой как тип триггера
Цель
Моя основная цель - достичь асинхронных триггеров в PHP с помощью веб-приложения Yii2
Мне нужно запустить пакетные задания php, но я не хочу ждать в браузере / cron для выполнения задания. Для выполнения задания мне нужно использовать другой файл моего приложения, например
http://myapp/foojob.php
В foojob.php следует асинхронно вызывать множество экземпляров php [Каждый экземпляр выполняет одно задание] на основе имеющихся в наличии заданий. Ограничение по времени вызова (foojob.php) меньше 60 секунд. мне нужно запустить новые экземпляры php, прежде чем он превысит значение тайм-аута.
Я ссылался и пытался
- curl_multi - я не мог найти в нем неблокирующий режим.
- fsock_открыть - Это возможно путем отправки соединения: Близко к вызову (но fsock open не всегда доступен на многих серверах общего хостинга или работает неправильно). Можете ли вы предложить мне какое-либо надежное решение с помощью fsock транспорт?
- pcntl_exec - Я не пробовал в режиме реального времени, но статистика в реальном времени показывает, что 45 % серверов отключили эту функцию. Я не знаю причины этого.
- потоковый транспорт - Я не знаю, как это работает?
Мои вопросы:
- Неблокирующие асинхронные запросы Есть ли какое-либо возможное решение, которое уже существует в git для достижения в PHP?
- Направьте меня, если мне нужно будет изучить какие-либо другие транспортные средства
- является существует ли какой-либо интеллектуальный механизм переключения транспорта (curl/fsock), основанный на окружающей среде?
Изменить:
Приложение является самостоятельным продуктом. это позволило бы получить работу на различных хостинговых сервисах. Общий хостинг не разрешает /не предоставляет никаких внешних расширений для своих клиентов.
2 answers
Вы могли бы использовать подход, при котором вы отправляете правильные заголовки, чтобы браузер закрыл соединение, а затем синхронно запустил процесс, и он будет казаться асинхронным конечному пользователю.
Вот кое-что, что я написал давным-давно, что вы можете увидеть в качестве примера. http://www.phpclasses.org/package/8388-PHP-Defer-execution-of-actions-until-the-script-ends.html
Я предполагаю, что в yii есть какое-то место, к которому вы могли бы подключиться после отправки контента, где вы могли бы сделать то же самое.
Краткая версия заголовка it ("Длина содержимого:".$длина); заголовок ("Соединение: Закрыть");
ob_flush(); // headers
echo $html;
flush();
doWork();
Я написал одну библиотеку php для неблокирующих фоновых заданий. Эта библиотека помогла бы достичь цели, которую я опубликовал
Библиотека композиторов https://packagist.org/packages/devbabuind/non-blocking-php