Я строю интеграцию, которая передает данные нескольким различным системам через API (REST). Мне нужно обработать данные как можно быстрее. Это базовый макет:
$data = array( Title => "Title", Subtitle => "Test", .....
$result1 = $class1->functionservice1($data);
$result2 = $class2->functionservice2($data);
$result3 = $class3->functionservice3($data);
echo "done";
Запустите скрипт, как описано выше, мне нужно дождаться завершения каждой функции, прежде чем она запустит следующую (это займет в 3 раза больше времени).
Существует ли простой способ запуска каждой сервисной функции асинхронно, но дождитесь завершения всех функций до (5) завершения отчета. Мне нужно иметь возможность извлекать данные из каждого $result
и верните это как один пост в 4-й сервис.
Извините, если это простой вопрос — я новичок в PHP
Большое спасибо, Бен
Да, есть несколько способов.
Наиболее эффективным является использование цикла обработки событий, который использует неблокирующие операции ввода-вывода для достижения параллелизма и совместной многозадачности.
Одна такая реализация цикла событий ампер. Есть HTTP-клиент, который работает с Amp, он называется Artax. Пример включен в его README. Вы должны посмотреть, как работают обещания и сопрограммы. Там в Amp\wait
смешать синхронный код с асинхронным кодом.
<?php
Amp\run(function() {
$client = new Amp\Artax\Client;
// Dispatch two requests at the same time
$promises = $client->requestMulti([
'http://www.google.com',
'http://www.bing.com',
]);
try {
// Yield control until all requests finish
list($google, $bing) = (yield Amp\all($promises));
var_dump($google->getStatus(), $bing->getStatus());
} catch (Exception $e) {
echo $e;
}
});
Другие способы включают использование потоков и / или процессов для достижения параллелизма. Использование нескольких процессов — самый простой способ, если вы хотите использовать свой текущий код. Однако порождение процессов не дешево, и использование потоков в PHP не очень хорошая вещь.
Вы также можете поместить свой код в другой файл php и вызвать его с помощью этого:
exec("nohup /usr/bin/php -f your script > /dev/null 2>&1 &");
Если вы хотите использовать асинхронность, как вы можете сделать на других языках, т.е. используя потоки, вам нужно будет установить расширение pthreads из PECL, потому что PHP не поддерживает многопоточность из коробки.
Вы можете найти объяснение того, как использовать темы с этим вопросом: