Асинхронный вызов функции в 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 54

6 ответов:

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

PHP threading вызов функции php асинхронно

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

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

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

плюсы:

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

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

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

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

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

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

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

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

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

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