Асинхронные HTTP-запросы в PHP - PullRequest
15 голосов
/ 06 августа 2009

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

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

Ответы [ 2 ]

9 голосов
/ 06 августа 2009

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

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

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

3 голосов
/ 06 августа 2009

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

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

...