上次给人推荐了这篇文章,关于PHP异步并行的文章,之后有人评论问这个组件能不能给fpm用,我测试了一下发现不行,于是又找到一个可以给fpm用的http请求组件.
安装很简单,就这样 composer require guzzlehttp/guzzle 进行安装一下.
然后代码示例如下:
我们先建一个文件作为一个长时间耗时的api接口,文件名api.php,代码如下:
<?php sleep(1); $act = isset($_GET['act']) ? $_GET['act'] : ""; echo date('Y-m-d H:i:s', time()) . " act: " . $act; exit;
这里我们让它睡眠1秒钟,然后输出当前时间.
然后建立一个请求的文件 index.php,代码如下:
<?php include "vendor/autoload.php"; use GuzzleHttp\Client; use GuzzleHttp\Promise;$start = microtime(true);$client = new Client(['verify' => false]); $promise = []; $list = []; foreach (range(1, 10) as $item) {$url = "http://local.async.com/api.php?act=" . $item;$promise[$item] = $client->postAsync($url, []); } $response = Promise\Utils::unwrap($promise); foreach ($response as $key => $value) {$list[] = (string)($value->getBody()); }$end = microtime(true); echo (($end - $start) * 1000) . " ms<br/>"; echo "<pre>"; var_dump($list); echo "</pre>";
这里我们还是让他发起10个请求,然后将结果放入到list数组里面存储,最后看看效果,
我们看到时间上只用了3秒钟左右,然后act的参数都有,说明请求确实到位了,然后这10个元素的请求结果时间并不是按照先后顺序执行的,是并行的,说明确实请求并行了,这样一来,在那种大数据量需要调用接口请求的时候i就派上用场了.
当然了,我这是在nginx+fpm模式下的测试结果,在cli模式下效果一样的.
如图: