不知道会不会阻塞当前进程
还请 walkor 大佬解答一下
一般来说都是非阻塞的,实际需要自己测试下
一键协程化以后,swoole会hook使用curl方式发送的http(s)请求。 我记得老大在文档里面说过其实就是老大在workerman中封装了那些协程化驱动。所以你就是看一下异步http客户端的实现是使用的什么发送请求应该就OK了。
已经试过了确实可以hook 不过在队列中 由于不是协程环境 es客户端会报错 尝试判断在非协程环境下用guzzle客户端 不知道为啥还是会hook 然后报错 此错误只会出现在X86架构 M系列芯片正常运行
目前解决方案是转用Fiber驱动了
//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()) // 设置自定义 Guzzle 客户端 ->setHosts($host) ->build(); } //错误信息 此错误不会出现在M系列芯片 目前Centos8出现 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()
一般来说都是非阻塞的,实际需要自己测试下
一键协程化以后,swoole会hook使用curl方式发送的http(s)请求。
我记得老大在文档里面说过其实就是老大在workerman中封装了那些协程化驱动。所以你就是看一下异步http客户端的实现是使用的什么发送请求应该就OK了。
已经试过了确实可以hook 不过在队列中 由于不是协程环境 es客户端会报错 尝试判断在非协程环境下用guzzle客户端 不知道为啥还是会hook 然后报错 此错误只会出现在X86架构 M系列芯片正常运行
目前解决方案是转用Fiber驱动了