不知道會(huì)不會(huì)阻塞當(dāng)前進(jìn)程
還請(qǐng) walkor 大佬解答一下
一鍵協(xié)程化以后,swoole會(huì)hook使用curl方式發(fā)送的http(s)請(qǐng)求。
我記得老大在文檔里面說過其實(shí)就是老大在workerman中封裝了那些協(xié)程化驅(qū)動(dòng)。所以你就是看一下異步http客戶端的實(shí)現(xiàn)是使用的什么發(fā)送請(qǐng)求應(yīng)該就OK了。
已經(jīng)試過了確實(shí)可以hook 不過在隊(duì)列中 由于不是協(xié)程環(huán)境 es客戶端會(huì)報(bào)錯(cuò) 嘗試判斷在非協(xié)程環(huán)境下用guzzle客戶端 不知道為啥還是會(huì)hook 然后報(bào)錯(cuò) 此錯(cuò)誤只會(huì)出現(xiàn)在X86架構(gòu) M系列芯片正常運(yùn)行
目前解決方案是轉(zhuǎn)用Fiber驅(qū)動(dòng)了
//composer.json 版本
"php": ">=8.1",
"workerman/webman-framework": "^2.1",
"elasticsearch/elasticsearch": "^8",
//部分代碼
use Workerman\Coroutine;
use Elastic\Elasticsearch\ClientBuilder;
function esClient($host = [])
{
$host = $host ?: [
env('ES_HOST', 'localhost:9200')
];
if (Coroutine::isCoroutine()) {
return ClientBuilder::create()
->setHosts($host)
->build();
}
return ClientBuilder::create()
->setHttpClient(new GuzzleHttp\Client()) // 設(shè)置自定義 Guzzle 客戶端
->setHosts($host)
->build();
}
//錯(cuò)誤信息 此錯(cuò)誤不會(huì)出現(xiàn)在M系列芯片 目前Centos8出現(xiàn)
PHP Fatal error: Uncaught Swoole\Error: API must be called in the coroutine in /www/wwwroot/webman/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php:44
Stack trace:
#0 /www/wwwroot/webman/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php(44): curl_exec()
#1 /www/wwwroot/webman/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php(28): GuzzleHttp\Handler\CurlHandler->__invoke()
#2 /www/wwwroot/webman/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php(48): GuzzleHttp\Handler\Proxy::GuzzleHttp\Handler\{closure}()
#3 /www/wwwroot/webman/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php(64): GuzzleHttp\Handler\Proxy::GuzzleHttp\Handler\{closure}()
#4 /www/wwwroot/webman/vendor/guzzlehttp/guzzle/src/Middleware.php(31): GuzzleHttp\PrepareBodyMiddleware->__invoke()
#5 /www/wwwroot/webman/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php(55): GuzzleHttp\Middleware::GuzzleHttp\{closure}()
#6 /www/wwwroot/webman/vendor/guzzlehttp/guzzle/src/Middleware.php(63): GuzzleHttp\RedirectMiddleware->__invoke()
#7 /www/wwwroot/webman/vendor/guzzlehttp/guzzle/src/HandlerStack.php(75): GuzzleHttp\Middleware::GuzzleHttp\{closure}()
#8 /www/wwwroot/webman/vendor/guzzlehttp/guzzle/src/Client.php(333): GuzzleHttp\HandlerStack->__invoke()
#9 /www/wwwroot/webman/vendor/guzzlehttp/guzzle/src/Client.php(106): GuzzleHttp\Client->transfer()
#10 /www/wwwroot/webman/vendor/guzzlehttp/guzzle/src/Client.php(138): GuzzleHttp\Client->sendAsync()
#11 /www/wwwroot/webman/vendor/elastic/transport/src/Transport.php(351): GuzzleHttp\Client->sendRequest()
#12 /www/wwwroot/webman/vendor/elasticsearch/elasticsearch/src/Client.php(181): Elastic\Transport\Transport->sendRequest()
#13 /www/wwwroot/webman/vendor/elasticsearch/elasticsearch/src/Traits/ClientEndpointsTrait.php(83): Elastic\Elasticsearch\Client->sendRequest()
#14 /www/wwwroot/webman/app/functions.php(217): Elastic\Elasticsearch\Client->bulk()
#15 /www/wwwroot/webman/app/functions.php(175): collectionEsIndexIdUpd()
#16 /www/wwwroot/webman/app/functions.php(104): {closure}()
#17 /www/wwwroot/webman/app/queue/redis/fast/IpRecordQueue.php(44): business_exceute_context_data()
#18 /www/wwwroot/webman/app/service/IpRecordService.php(58): App\queue\redis\fast\IpRecordQueue->App\queue\redis\fast\{closure}()
#19 /www/wwwroot/webman/app/queue/redis/fast/IpRecordQueue.php(26): App\service\IpRecordService::lockUpd()
#20 /www/wwwroot/webman/vendor/workerman/redis-queue/src/Client.php(243): App\queue\redis\fast\IpRecordQueue->consume()
#21 /www/wwwroot/webman/vendor/workerman/redis/src/Client.php(421): Workerman\RedisQueue\Client->Workerman\RedisQueue\{closure}()
#22 /www/wwwroot/webman/vendor/workerman/workerman/src/Connection/TcpConnection.php(741): Workerman\Redis\Client->Workerman\Redis\{closure}()
#23 [internal function]: Workerman\Connection\TcpConnection->baseRead()
#24 /www/wwwroot/webman/vendor/workerman/workerman/src/Events/Event.php(250): EventBase->loop()
#25 /www/wwwroot/webman/vendor/workerman/workerman/src/Worker.php(1740): Workerman\Events\Event->run()
#26 /www/wwwroot/webman/vendor/workerman/workerman/src/Worker.php(1545): Workerman\Worker::forkOneWorkerForLinux()
看起來像是在隊(duì)列中也設(shè)置了SWOOLE_HOOK_ALL,當(dāng)這個(gè)一設(shè)置,會(huì)馬上替換原本的阻塞函數(shù)為非阻塞函數(shù)
你可以用Fiber驅(qū)動(dòng)的協(xié)程,es可以用Guzzle
來封裝客戶端,Guzzle
可以引入 amphp/http-client-guzzle-adapter
提供協(xié)程支持
目前解決方案只能使用 fiber。 已知 guzzle 客戶端在 swoole 環(huán)境中正常運(yùn)行,但進(jìn)入到隊(duì)列中就無法正常使用了,如果要完全兼容的話,可能也要像 hyperf 官方出一套自己的客戶端才能正常使用