http-client swoole协程 socket连接失败时无法中止

筱洛洛

问题描述

使用http-client时,被访问的地址出现连接异常或者地址不存在时或者dns解析失败时,请求无法中止,且超时失效
如下图所示,迟迟无法得到响应,像是协程死锁
截图

程序代码

public function index()
    {
        $http = new \Workerman\Http\Client(['connect_timeout' => 3, 'timeout' => 3,]);
        try {
            $response = $http->request('https://www.asdasfowoefbowefbwe.com',['method' => 'GET'])->getBody()->getContents();
        }catch (\Exception $e){
            $response = $e->getMessage();
        }
        var_dump($response);
        return $response;
    }

报错信息

root@7a179c6324dc:/var/www# php start.php start
Workerman[start.php] start in DEBUG mode
-------------------------------------------- WORKERMAN ---------------------------------------------
Workerman/5.1.3         PHP/8.1.31 (JIT off)          Linux/6.6.87.2-microsoft-standard-WSL2
--------------------------------------------- WORKERS ----------------------------------------------
event-loop  proto       user        worker      listen                 count       state            
swoole      tcp         root        webman      http://0.0.0.0:8787    1            [OK]            
swoole      tcp         root        monitor     none                   1            [OK]            
----------------------------------------------------------------------------------------------------
Press Ctrl+C to stop. Start success.

Warning: stream_socket_client(): Unable to connect to tcp://www.asdasfowoefbowefbwe.com:443 (DNS Lookup resolve failed) in /var/www/vendor/workerman/workerman/src/Connection/AsyncTcpConnection.php on line 269

Warning: stream_socket_client(): Unable to connect to tcp://www.asdasfowoefbowefbwe.com:443 (DNS Lookup resolve failed) in /var/www/vendor/workerman/workerman/src/Connection/AsyncTcpConnection.php on line 269

截图报错信息里报错文件相关代码

截图

操作系统及workerman/webman等框架组件具体版本

Workerman/5.1.3
PHP/8.1.31 (JIT off)
Linux/6.6.87.2-microsoft-standard-WSL2
workerman/http-client 3.0.4
workerman/webman-framework 2.1.2
swoole 5.1.7

131 1 0
1个回答

Tinywan

这个错误 DNS Lookup resolve failed 表明 PHP 无法将目标域名解析为 IP 地址,核心原因是域名解析失败。

  • 筱洛洛 4天前

    我知道是这个原因,但是出现这个错误后,程序直接就卡死了

  • 筱洛洛 4天前

    正常情况下应该抛出异常,中止请求

🔝