php多进程编程spatie/async

有些业务场景可能需要同时调用三方接口50次甚至更多

使用多进程,提高接口响应效率

一. 安装扩展包

安装扩展包 composer require spatie/async

先看效果 减少了47秒的响应时间,这样就能满足业务需求

php多进程编程spatie/async

php多进程编程spatie/async

二. 对于多次api请求业务可以异步编程,但是对于哪些密集型计算的同步耗时更短。看使用场景

代码如下

<?php
require './vendor/autoload.php';

use Spatie\Async\Pool;
use GuzzleHttp\Client;

$stime = microtime(true); //获取程序开始执行的时间
echo "初始: " . round(memory_get_usage() / 1024 / 1024, 2) . ' MB' . "\n";

// 业务逻辑
$d = []; //存储数据使用

//100次curl 请求
$pool = Pool::create();
$client = new Client();
foreach (range(1, 99) as $i) {
    $pool[] = async(function () use ($i, $client) {

        $response = $client->get('https://www.xxx.cn/api/getTemplateLogInfo', [
        ]);
        $output = $response->getBody()->getContents();
        $d[] = $output;
        return $output;
    })->then(function ($output) use (&$d) {
        $d[] = $output;
    });
}
await($pool);



//foreach (range(1, 99) as $i) {
//
//        $j = curlGet();
//
//        $d[] = $j;
//
//}


$etime = microtime(true);//获取程序执行结束的时间
$total = $etime - $stime;   //计算差值
echo "[页面执行时间:{$total} ]秒" . "\n";
echo "使用: " . round(memory_get_usage() / 1024 / 1024, 2) . ' MB' . "\n";// 获取运行时间 和 占用内存
var_dump($d);
function curlGet()
{
    $client = new Client();
    $response = $client->get('https://www.xxx.cn/api/getTemplateLogInfo', [
    ]);
    $content = $response->getBody()->getContents();
    return $content;
}
php
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 9

我们用hyperf swoole来处理这种的

1年前 评论

并发请求,用guzzle会更好

1年前 评论
张三L (楼主) 1年前

curl_multi ......

1年前 评论

guzzle 就封装的有 curl_multi_* 系列方法的,效果应该差不多。

1年前 评论

可以使用 pcntl 拓展

1年前 评论
随波逐流

GuzzleHttp 并发请求还是挺香。

$promises = [];
$client = \Illuminate\Support\Facades\Http::async();
for ($i = 10; $i--;) {
    $promises[] = $client->get('https://www.baidu.com');
}
$results = \GuzzleHttp\Promise\Utils::unwrap($promises);
foreach ($results as $result) {
    print_r($result);
}
1年前 评论

前几天刚用到了原生php curl curl_multi 并发请求

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!