У меня есть PHP-скрипт, который обрабатывает данные, загруженные из нескольких REST API, в стандартизированный формат и создает массив или таблицу этих данных. В настоящее время скрипт выполняет все синхронно и поэтому занимает слишком много времени.
Я пытался научиться выполнять функцию, которая извлекает и обрабатывает данные одновременно или асинхронно, чтобы общее время было временем самого медленного вызова. Из моих исследований следует, что ReactPHP или Amp являются правильными инструментами.
Однако мне не удалось создать тестовый код, который действительно выполняется правильно. Простой пример прилагается, где mysquare() представляет мою более сложную функцию. Из-за отсутствия примеров в сети именно того, чего я пытаюсь достичь, я был вынужден использовать метод грубой силы с 3 примерами, перечисленными в моем коде.
Q1: Использую ли я правильный инструмент для работы?
Q2: Можете ли вы исправить мой пример кода, чтобы он выполнялся асинхронно?
NB: я настоящий новичок, поэтому будет оценен самый простой пример кода с минимумом высокоуровневого жаргона программирования.
<?php
require_once("../vendor/autoload.php");
for ($i = 0; $i <= 4; $i++) {
// Experiment 1
$deferred[$i] = new React\Promise\Deferred(function () use ($i) {
echo $x."\n";
usleep(rand(0, 3000000)); // Simulates long network call
return array($x=> $x * $x);
});
// Experiment 2
$promise[$i]=$deferred[$i]->promise(function () use ($i) {
echo $x."\n";
usleep(rand(0, 3000000)); // Simulates long network call
return array($x=> $x * $x);
});
// Experiment 3
$functioncall[$i] = function () use ($i) {
echo $x."\n";
usleep(rand(0, 3000000)); // Simulates long network call
return array($x=> $x * $x);
};
}
$promises = React\Promise\all($deferred); // Doesn't work
$promises = React\Promise\all($promise); // Doesn't work
$promises = React\Promise\all($functioncall); // Doesn't work
// print_r($promises); // Doesn't return array of results but a complex object
// This is what I would like to execute simulatenously with a variety of inputs
function mysquare($x)
{
echo $x."\n";
usleep(rand(0, 3000000)); // Simulates long network call
return array($x=> $x * $x);
}