асинхронный — асинхронный PHP | Обработка данных в несколько систем (Совет)

Я строю интеграцию, которая передает данные нескольким различным системам через API (REST). Мне нужно обработать данные как можно быстрее. Это базовый макет:

  1. Разбор и обработка данных (возможно, в массив, как показано ниже)

$data = array( Title => "Title", Subtitle => "Test", .....

  1. Отправить данные в сервис (1) $result1 = $class1->functionservice1($data);
  2. Отправить данные в сервис (2) $result2 = $class2->functionservice2($data);
  3. Отправить данные в сервис (3) $result3 = $class3->functionservice3($data);
  4. Завершение отчета echo "done";

Запустите скрипт, как описано выше, мне нужно дождаться завершения каждой функции, прежде чем она запустит следующую (это займет в 3 раза больше времени).

Существует ли простой способ запуска каждой сервисной функции асинхронно, но дождитесь завершения всех функций до (5) завершения отчета. Мне нужно иметь возможность извлекать данные из каждого $result и верните это как один пост в 4-й сервис.

Извините, если это простой вопрос — я новичок в PHP

Большое спасибо, Бен

3

Решение

Да, есть несколько способов.

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

Одна такая реализация цикла событий ампер. Есть 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 не очень хорошая вещь.

2

Другие решения

Вы также можете поместить свой код в другой файл php и вызвать его с помощью этого:

 exec("nohup /usr/bin/php -f your script > /dev/null 2>&1 &");
1

Если вы хотите использовать асинхронность, как вы можете сделать на других языках, т.е. используя потоки, вам нужно будет установить расширение pthreads из PECL, потому что PHP не поддерживает многопоточность из коробки.

Вы можете найти объяснение того, как использовать темы с этим вопросом:

0
По вопросам рекламы [email protected]