Hyperf框架Failed to open stream: DNS Lookup resolve timeout[35]
                                                                
                24-07-19 14:48
                字数 2006
                阅读 3756
                                已编辑
                                            
            解决办法
// server.php的settings指定dns server
'settings' => [
    Constant::OPTION_ENABLE_COROUTINE => true,
    Constant::OPTION_WORKER_NUM => swoole_cpu_num(),
    Constant::OPTION_PID_FILE => BASE_PATH . '/runtime/hyperf.pid',
    Constant::OPTION_OPEN_TCP_NODELAY => true,
    Constant::OPTION_MAX_COROUTINE => 100000,
    Constant::OPTION_OPEN_HTTP2_PROTOCOL => true,
    Constant::OPTION_MAX_REQUEST => 100000,
    Constant::OPTION_SOCKET_BUFFER_SIZE => 2 * 1024 * 1024,
    Constant::OPTION_BUFFER_OUTPUT_SIZE => 2 * 1024 * 1024,
    // dns server设置,可设置其他可用的
    Constant::OPTION_DNS_SERVER => '8.8.8.8',
]问题分析
以下就用file_get_contents测试分析,已知的影响是有请求域名大概都有这个问题(curl没影响),比如连接阿里云数据库,redis等
$content = file_get_contents('https://www.baidu.com');file_get_contents直接堵塞了,等超时结束,控制台输出Failed to open stream: DNS Lookup resolve timeout[35],原因是dns解析超时,这里觉得很奇怪,dns解析不是依赖操作系统设置的dns server嘛
 先排除一下是否为框架的问题
先排除一下是否为框架的问题
// 原生swoole,因为hyperf开启了协程,所以原生也用协程
\Swoole\Coroutine\run(function () {
    \Swoole\Coroutine::create(function () {
        $content = file_get_contents('https://www.baidu.com');
        var_dump($content);
    });
});请求正常返回,并没有出现dns解析超时的情况,再看看swoole dnsLookup的结果
// 原生swoole
\Swoole\Coroutine\run(function () {
    $ip = \Swoole\Coroutine::dnsLookup('www.baidu.com', 5);
    if (!$ip) {
        var_dump(swoole_strerror(swoole_last_error()));
    }
    var_dump($ip);
});
// hyperf
$ip = Coroutine::dnsLookup('www.baidu.com', 5);
if (!$ip) {
    var_dump(swoole_strerror(swoole_last_error()));
}
var_dump($ip);原生swoole输出ip,hyperf输出false,错误信息是DNS Lookup resolve failed。最后只能试试设置dns server,这里被坑了很久,问了AI swoole是否可以设置dns server,AI表示不可以,于是修改操作系统dns server,仍旧无法解析,困扰半天偶然看到open swoole的文档,才知道dns_server这个设置,还是要认真看看文档呀。
Coroutine::set(['dns_server' => '8.8.8.8']);
$ip = Coroutine::dnsLookup('www.baidu.com', 5);
if (!$ip) {
    var_dump(swoole_strerror(swoole_last_error()));
}
var_dump($ip);输出ip,dns解析成功,再调用file_get_contents也正常了。通过设置dns_server解决了问题,但是根本原因是什么并没有找出来,原生可以框架不行,有时间再深究一下。
1人点赞>
                    
                0 条评论
            
            
                排序方式
                时间
                投票
            
        快来抢占一楼吧
    请登录后发表评论
        
        相关推荐
        
    文章归档
    
最新文章
        最受欢迎
    05-14 12:45
                    昨天 12:05
                    23-09-27 17:00
                    23-09-03 10:57
                    3 评论
                    3 评论
                    2 评论
                     
         
                     
                     
    