webman 开启 swoole 协程后能直接使用 http 和 es 客户端吗

破建站的

不知道会不会阻塞当前进程

还请 walkor 大佬解答一下

117 4 0
4个回答

一般来说都是非阻塞的,实际需要自己测试下

  • 暂无评论
jack10082009

一键协程化以后,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()
  • 暂无评论
胡桃

人家都跟你说了要在协程环境使用协程API

  • 暂无评论
×
🔝