网络重新插入后 PHP 应用程序连接失败

网络重新插入后 PHP 应用程序连接失败

我的数据中心的网络似乎出现了一些问题,因此我的服务器已经断网大约一个小时了。

在连接完全重新建立后,我的代码仍然不断报告同样的问题,直到我重新启动服务。

该代码是一个简单的 PHP 代码,它永远循环检查 Apple 反馈服务器,然后休眠几分钟,然后重新开始。

现在我明白了如果网络中断会产生错误,但是一旦网络恢复,为什么它会继续,直到我重新启动代码? PHP 是否有需要重新初始化的东西?

消息日志:

Dec 20 08:57:22 server kernel: r8169: eth0: link down
Dec 20 08:57:28 server kernel: r8169 0000:06:00.0: eth0: link up
Dec 20 08:57:29 server kernel: r8169: eth0: link down
Dec 20 08:57:33 server kernel: r8169 0000:06:00.0: eth0: link up
Dec 20 08:57:33 server kernel: r8169: eth0: link down
Dec 20 08:57:37 server kernel: r8169 0000:06:00.0: eth0: link up
Dec 20 08:57:38 server kernel: r8169: eth0: link down
Dec 20 08:57:44 server kernel: r8169 0000:06:00.0: eth0: link up
Dec 20 08:57:44 server kernel: r8169: eth0: link down
Dec 20 08:57:52 server kernel: r8169 0000:06:00.0: eth0: link up
Dec 20 08:57:52 server kernel: r8169: eth0: link down
Dec 20 09:10:58 server kernel: r8169 0000:06:00.0: eth0: link up

PHP 错误:

PHP Warning:  stream_socket_client(): php_network_getaddresses: getaddrinfo failed: Name or service not known in /home/push/feedback.php on line 36

代码第 36 行:

$apns = stream_socket_client('ssl://feedback.sandbox.push.apple.com:2196', $errcode, $errstr, 60, STREAM_CLIENT_CONNECT, $stream_context);

答案1

我猜测是 DNS 缓存。

错误消息getaddrinfo failed: Name or service not known表明存在 DNS 错误,可能是 NXDOMAIN 响应或 SERVFAIL。我推测这是在网络故障且响应被缓存时发生的,导致它在网络恢复后继续失败。

这两个响应允许缓存,但通常没有肯定响应那么长。NXDOMAIN 响应可以缓存 SOA 最短时间(通常在 600 到 3600 秒之间),SERVFAIL 响应最多可以缓存 300 秒。

重新启动服务可能会刷新缓存,或者您可能恰好在缓存自然过期的同时重新启动服务。我不知道任何内部 PHP DNS 缓存,所以我倾向于后者。如果再次发生这种情况,或者您为了调试问题而重现问题,请尝试使用dig feedback.sandbox.push.apple.com将测试范围缩小到仅 DNS 查找。

相关内容