Асинхронный вызов функции в 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 ++ или что-то в этом роде.

Я считаю, что ответ лежит здесь:

PHP-потоковый вызов функции php асинхронно

Быстрое примечание: используйте резьбу

cURL будет вашим единственным реальным выбором здесь (или с использованием неблокирующих сокетов и некоторой пользовательской логики).

Эта ссылка должна отправить вас в правильном направлении. В PHP нет асинхронной обработки, но если вы пытаетесь сделать несколько одновременных веб-запросов, cURL multi позаботится об этом для вас.

У меня нет прямого ответа, но вы можете посмотреть на эти вещи:

Я думаю, что если HTML и другие элементы пользовательского интерфейса нуждаются в данных, возвращаемых, то не будет способа их асинхронизации.

Я считаю, что единственный способ сделать это в PHP – это регистрировать запрос в базе данных и проверять cron каждую минуту или использовать что-то вроде обработки очереди Gearman или, может быть, exec () процесс командной строки

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

Чтобы обойти проблему, сколько разных запросов вы ожидаете? Не могли бы вы загрузить их автоматически каждый час или около того и сохранить в базе данных?

В настоящее время лучше использовать очереди, чем потоки (для тех, кто не использует Laravel, там есть множество других реализаций).

Основная идея заключается в том, что ваш оригинальный PHP-скрипт ставит задачи или задания в очередь. Затем у вас есть рабочие места в очереди, работающие в другом месте, выводя задания из очереди и начинают обрабатывать их независимо от исходного PHP.

Преимущества:

  1. Масштабируемость – вы можете просто добавить рабочие узлы, чтобы не отставать от спроса. Таким образом, задачи выполняются параллельно.
  2. Надежность – современные менеджеры очереди, такие как RabbitMQ, ZeroMQ, Redis и т. Д., Становятся чрезвычайно надежными.

Существует также http v2, который является оберткой для завитки. Может быть установлен через pecl.

http://devel-m6w6.rhcloud.com/mdref/http/