Асинхронные HTTP-запросы в PHP

Есть ли разумный способ сделать асинхронный HTTP-запрос в PHP без отбрасывания ответа? I.e., что-то похожее на AJAX - PHP script инициирует запрос, делает это сам, а позже, когда получен ответ, функция/метод обратного вызова или другой script обрабатывает ответ.

Один подход перешел мне в голову - порождает новый php-процесс с другим script для каждого запроса - второй script выполняет запрос, ждет ответа, а затем анализирует данные и делает все, что ему нужно, в то время как оригинал script продолжает генерировать новые процессы. Однако я сомневаюсь в производительности в этом случае - должно быть какое-то ограничение производительности от необходимости создавать новый процесс каждый раз.

Ответы

Ответ 1

Да, в зависимости от трафика вашего сайта, создание отдельного процесса PHP для запуска script может быть разрушительным. Было бы более эффективно использовать shell_exec() для запуска фонового процесса, который сохраняет вывод в имя файла, которое вы уже знаете, но даже это может быть ресурсоемким.

У вас также может быть очередь запросов, хранящаяся в базе данных. Один, отдельный фоновый процесс вытащил бы задание, выполнил его и сохранил вывод, возможно, установив флаг в БД, который мог проверить ваш веб-процесс.

Если вы собираетесь использовать подход очереди DB, используйте curl_multi * класс функций для отправки всех запросов в очередь сразу. Это ограничит время выполнения каждой итерации в фоновом процессе до самого длинного времени запроса.

Ответ 2

V5 может не быть потоковым, но вы можете создавать приложения, которые используют многозадачность в процессе.

Ознакомьтесь с следующей статьей: "Разработка многозадачных приложений с помощью PHP V5" из IBM DeveloperWorks. Вы можете найти его здесь http://www.ibm.com/developerworks/web/library/os-php-multitask/