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

**URL:** <https://www.shiqidu.com/t/topic/819>\
**Category:** 开发调优\
**Tags:** PHP\
**Created:** [2024 年7 月 19 日 06:48 UTC](https://www.shiqidu.com/t/topic/819 "2024-07-19T06:48:00Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

作者： ![danton](https://www.shiqidu.com/user_avatar/www.shiqidu.com/danton/32/489_2.png) [@danton](https://www.shiqidu.com/u/danton)\
发布日期： [2024 年7 月 19 日 06:48 UTC](https://www.shiqidu.com/t/topic/819/1 "2024-07-19T06:48:00Z")

</div>

### 解决办法

```auto
// 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等

```auto
$content = file_get_contents('https://www.baidu.com');

```

file\_get\_contents直接堵塞了，等超时结束，控制台输出Failed to open stream: DNS Lookup resolve timeout[35]，原因是dns解析超时，这里觉得很奇怪，dns解析不是依赖操作系统设置的dns server嘛

 ![](https://discourse.shiqidu.com/uploads/default/original/1X/5e3b95be64e2723be47b39efc12522bbad12aaa6.png)  
先排除一下是否为框架的问题

```auto
// 原生swoole，因为hyperf开启了协程，所以原生也用协程
\Swoole\Coroutine\run(function () {
    \Swoole\Coroutine::create(function () {
        $content = file_get_contents('https://www.baidu.com');
        var_dump($content);
    });
});

```

请求正常返回，并没有出现dns解析超时的情况，再看看swoole dnsLookup的结果

```auto
// 原生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这个设置，还是要认真看看文档呀。

```auto
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解决了问题，但是根本原因是什么并没有找出来，原生可以框架不行，有时间再深究一下。
