Hyperf框架Failed to open stream: DNS Lookup resolve timeout[35]

07-19 14:48 字数 2006 阅读 1296 已编辑

解决办法

// 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 条评论
排序方式 时间 投票
快来抢占一楼吧
请登录后发表评论