当 PHP 在 Apache 中执行时,我们其中一台没有进一步更新或重新配置的旧旧服务器突然停止将主机名解析为 IP。但是,当从 CLI 执行时,它仍然可以正常工作。
从 RSS 缓存的最后修改时间,我推断它在 3 月 28 日左右停止工作。
为了重现这个问题,我创建了一个脚本fsockopen()
,它说“连接失败(errno 2)”。我进一步将问题减少为与失败的名称解析有关:
<?php $addr = gethostbyname("twitter.com"); echo "ADDR($addr)"; ?>
当我通过 Apache 运行它时,输出是ADDR(twitter.com)
,这是错误的。
当我从 CLI 运行它时,输出ADDR(aaa.bbb.ccc.ddd)
与预期的一样具有不同的 IP 地址。
服务器设置上没有任何变化。CLI 和 Apache 模块共享相同的php.ini
. PHP 是带有 Zend Optimizer v2.5.10 的 v4.4.9 版本。Apache 是 v1.3.31。
我知道版本很旧。但是由于没有任何更改,因此像“尝试先升级版本”这样的解决方案是没有解决方案的,因为服务器的功能集/版本控制被冻结并且很快就会被替换。我们仍然需要一个解决方案。
如果我运行dig
脚本,它可以在两种环境(mod_php 和 CLI)中运行,但这不仅仅是一个丑陋的 hack,因为它会涉及整个脚本库中的许多编辑和测试,这也是不受欢迎的,因为服务器上的 PHP 应用程序是也被冻结,并且只接收安全更新。它将被完全重写(在新服务器上)取代。
但是由于重写需要一些时间并且会连续替换遗留应用程序的部分,我们需要修复解决程序问题。我已经用谷歌搜索了一下,虽然问题是已知的,但很多人都没有找到解决办法。提高内存限制的修复不起作用。重新启动不起作用。mod_php 中的解析器只是无缘无故停止工作。:-(
更新:我同时通过完全停止 apache 来解决它,等待片刻,然后重新启动它。但这并不能解释这种行为的根本原因(因此没有令人满意的解决方案)。所以我把这个打开。
正常重启和正常重启都不起作用。我需要完全停止 apache,等待所有进程完成,然后再次启动 apache。问题解决了。由于似乎没有人找到这种行为的根本原因的解释,我接受了我自己的解决方案。
从 CLI 运行时相同,通过 Apache 运行时出错。我猜这与更改名称服务器有关,例如在/etc/resolv.conf 中。不知何故 Apache(其他程序也受到影响)不检查更改的名称服务器并且无法解析。当我用笔记本电脑切换网络时,就会发生这种情况。我必须手动停止 apache、opera、firefox 等,以便它们获得新的名称服务器设置。
来自PHP.net 手册上 gethostbyname的评论:
和