我有5個(gè)for循環(huán)
for(...){
sleep(3)// 耗時(shí)結(jié)果
}
for(...){
sleep(5)// 耗時(shí)結(jié)果
}
for(...){
sleep(6)// 耗時(shí)結(jié)果
}
for(...){
sleep(7) // 耗時(shí)結(jié)果
}
for(...){
sleep(10) // 耗時(shí)結(jié)果
}
在c#中,我只需要開5個(gè)線程,然后等待全部完成,返回結(jié)果。總耗時(shí)10秒。
$result = waitAll();
// 需要返回上面的計(jì)算結(jié)果給response ,所以不能用隊(duì)列之類的。
剛剛webman執(zhí)行效率和開發(fā)效率不是一般的快,真是太NB了!!但是在PHP或者webman有什么好的方式能處理這類的需求嗎?核心訴求是有沒有辦法能并發(fā)執(zhí)行for,然后等待全部執(zhí)行完畢,返回結(jié)果。
// ...
return [
// ...
'event_loop' => \Workerman\Events\Swoole::class,
// ...
];
<?php
declare(strict_types=1);
namespace app\controller;
use co;
use support\Request;
class Controller
{
public function action(Request $request)
{
$cid_group[] = go(fn() => co::sleep(3));
$cid_group[] = go(fn() => co::sleep(5));
$cid_group[] = go(fn() => co::sleep(6));
$cid_group[] = go(fn() => co::sleep(7));
$cid_group[] = go(fn() => co::sleep(10));
co::join($cid_group);
// ...
}
}
C# 里面開多線程去做,php單線程就能完成這種并發(fā)請(qǐng)求。
安裝swoole、openswoole擴(kuò)展隨便選擇一個(gè),具體用法:https://wiki.swoole.com/#/coroutine/wait_group?id=coroutinewaitgroup
config/server.php
// ...
return [
// ...
'event_loop' => \Workerman\Events\Swoole::class,
// ...
];
/**
也可以看看swoole 框架有沒有好用的http-client工具庫,這是其中一個(gè):https://hyperf.wiki/3.1/#/zh-cn/guzzle (我沒在workerman環(huán)境使用過,你自己親測(cè)下)
*/
什么擴(kuò)展都不安裝,選擇php.net的方式
// 初始化 cURL
$ch1 = curl_init('http://www.example.com/');
$ch2 = curl_init('http://www.example.org/');
// 創(chuàng)建 cURL 多個(gè)批處理句柄
$mh = curl_multi_init();
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
$active = null;
// 執(zhí)行批處理
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
// 等待活動(dòng)連接,直到有活動(dòng)連接或超時(shí)
if ($mrc == CURLM_OK) {
if (curl_multi_select($mh) == -1) {
usleep(1);
}
}
// 循環(huán)直到?jīng)]有活動(dòng)連接
do {
$mrc = curl_multi_exec($mh, $active);
} while ($active > 0);
// 關(guān)閉所有句柄
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
3.選擇guzzle/http庫異步并發(fā)庫,請(qǐng)查看 https://github.com/guzzle/guzzle (自行查詢用法)