Асинхронный вызов функции в PHP
Я работаю над веб-приложением PHP, и мне нужно выполнить некоторые сетевые операции в запросе, такие как извлечение кого-то с удаленного сервера на основе запроса пользователя.
можно ли имитировать асинхронное поведение в PHP, учитывая, что мне нужно передать некоторые данные в функцию, а также нужно вывести из нее.
мой код выглядит так:
<?php
$data1 = processGETandPOST();
$data2 = processGETandPOST();
$data3 = processGETandPOST();
$response1 = makeNetworkCall($data1);
$response2 = makeNetworkCall($data2);
$response3 = makeNetworkCall($data3);
processNetworkResponse($response1);
processNetworkResponse($response2);
processNetworkResponse($response3);
/*HTML and OTHER UI STUFF HERE*/
exit;
?>
каждая сетевая операция занимает около 5 секунд, чтобы завершить создание всего 15 секунд на ответ время моего заявления, учитывая, что я делаю 3 запроса.
функция makeNetworkCall () просто выполняет запрос HTTP POST.
удаленный сервер является сторонним API, поэтому у меня нет никакого контроля над ним.
PS: пожалуйста, не отвечайте на предложения об AJAX или других вещах. В настоящее время я ищу, могу ли я сделать это через PHP, возможно, с расширением C++ или что-то в этом роде.
6 ответов:
Я считаю, что ответ лежит здесь:
PHP threading вызов функции php асинхронно
быстрое Примечание: используйте резьбу
В настоящее время, это лучше использовать очереди чем потоки (для тех, кто не использует Laravel есть тонны других реализаций там такой).
основная идея заключается в том, что ваш оригинальный PHP-скрипт помещает задачи или задания в очередь. Затем у вас есть очередь рабочих мест, работающих в другом месте, принимая задания из очереди и начинает обрабатывать их независимо от исходного PHP.
плюсы:
- масштабируемость - вы можете просто добавить рабочие узлы, чтобы идти в ногу со спросом. Таким образом, задачи выполняются параллельно.
- надежность-современные администраторы очередей, такие как RabbitMQ, ZeroMQ, Redis и т. д., сделаны чрезвычайно надежными.
cURL будет вашим единственным реальным выбором здесь (либо это, либо использование неблокирующих сокетов и некоторой пользовательской логики).
этой ссылке должны направить вас в правильном направлении. В PHP нет асинхронной обработки, но если вы пытаетесь сделать несколько одновременных веб-запросов, cURL multi позаботится об этом для вас.
У меня нет прямого ответа, но вы можете посмотреть на эти вещи:
- проект отдачи -https://github.com/recoilphp/recoil
- расширение PHP LibEvent? http://www.php.net/manual/en/book.libevent.php
- процесс разветвления http://www.php.net/manual/en/function.pcntl-fork.php
- брокеры сообщений, т. е. вы можете запустить рабочих для выполнения HTTP-вызовов и после этого
job
сделано, вставьте новое задание, описывающее работу, которая должна быть выполнена для обработки кэшированного тела ответа HTTP.
Я думаю, что если HTML и другие материалы пользовательского интерфейса нуждаются в возврате данных, то не будет способа асинхронности.
Я считаю, что единственный способ сделать это в PHP - это зарегистрировать запрос в базе данных и каждую минуту проверять cron, или использовать что-то вроде обработки очереди Gearman, или, возможно, exec() процесс командной строки
в то же время вам php-страница должна была бы генерировать некоторый html или js, который заставляет ее перезагружаться каждые несколько секунд, чтобы проверить прогресс, а не идеальный.
чтобы обойти этот вопрос, сколько различных запросов вы ожидаете? Не могли бы вы загружать их все автоматически каждый час или около того и сохранять в базе данных?