php - 无法获得异步执行的 ReactPHP 承诺
问题描述
我有一个 PHP 脚本,它将从多个 REST API 下载的数据处理为标准化格式,并构建此数据的数组或表。该脚本当前同步执行所有内容,因此需要很长时间。
我一直在尝试学习如何同时或异步执行获取和处理数据的函数,以便总时间是最慢调用的时间。根据我的研究,ReactPHP 或 Amp 似乎是正确的工具。
但是,我未能成功创建实际正确执行的测试代码。附上一个简单的例子,mysquare() 代表我更复杂的函数。由于网络上缺乏我想要达到的目标的示例,我被迫使用蛮力方法,在我的代码中列出了 3 个示例。
Q1:我是否使用了正确的工具来完成这项工作?
Q2:你能修复我的示例代码以异步执行吗?
注意:我是一个真正的初学者,所以使用最少高级编程术语的最简单的代码示例将不胜感激。
<?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);
}
解决方案
异步并不意味着多个线程并行执行。如果两个函数(例如)执行诸如 HTTP 请求之类的 IO,则它们只能在“同时”真正运行。
usleep() 阻塞,所以你一无所获。ReactPHP 和 Amp 本身都将具有某种“睡眠”功能,这些功能直接内置到事件循环中。
出于同样的原因,您将不能只使用 curl,因为它也会立即阻塞。您需要使用 React 和 Amp 提供和/推荐的 HTTP 库。
由于您的最终目标只是执行 HTTP 请求,因此您也不能使用任何这些框架,而只使用 curl_multi 函数。虽然它们有点难以使用。
推荐阅读
- javascript - 循环间并行,循环内多个异步操作,如何实现?
- c# - UserManager 中没有可见的实现细节
ASP.net Core 中的类 - delphi - FireDAC SQLITE:没有这样的表列:PRAGMA_TABLE_INFO
- javascript - 元素焦点跳到将其设置为空
- python - 在虚拟环境中安装 matplotlib 时出错
- aws-lambda - AWS Java - 从 lambda 承担角色以调用 API 网关
- jsonschema - 如果存在 2 个相同的属性名称,则在使用 Json Schema 验证 Json Payload 时应该引发解析错误?
- javascript - 怎么玩在没有外部库的 React 中?
- cookies - IdentityServer4 访问令牌和 Cookie
- c++ - 如何将中断向量表包装到 std::array 中?