我的数据中心的网络似乎出现了一些问题,因此我的服务器已经断网大约一个小时了。
在连接完全重新建立后,我的代码仍然不断报告同样的问题,直到我重新启动服务。
该代码是一个简单的 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 查找。