PHP:当在Apache中运行时,gethostbyname()突然不再将名称parsing为IP

当我们在Apache中执行PHP时,其中一个没有进一步更新或重新configuration的旧式服务器突然停止将主机名parsing为IP。 但是,从CLI执行时仍然可以正常工作。

从RSScaching上次修改时间,我推断它在3月28日左右停止工作。

为了重现这个问题,我使用fsockopen()创build了一个脚本,它说“连接失败(errno 2)”。 我进一步减less了与失败的名称parsing有关的问题:

 <?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。

我知道版本是旧的。 但由于没有任何改变,像“先尝试升级版本”的解决scheme是没有解决scheme,因为服务器的function设置/版本被冻结,并将很快被replace。 我们仍然需要解决scheme。

如果我通过脚本运行dig ,它可以在两个环境(mod_php和CLI)中工作,但这不仅仅是一个丑陋的黑客攻击,因为它涉及许多编辑和testing,整个脚本库也是不受欢迎的,因为服务器上的PHP应用程序也被冻结,只收到安全更新。 它将被完全重写(在新服务器上)所取代。

但是由于重写需要一些时间,并且需要连续地replace遗留应用程序的一部分,所以我们需要修复parsing器问题。 我已经search了一下,虽然这个问题是已知的,但是很多人没有find解决办法。 提高内存限制的修复程序不起作用。 重新启动没有工作。 mod_php中的parsing器只是停止工作,没有明显的原因。 🙁

更新:我通过完全停止Apache来解决它,等待片刻,然后再次启动它。 但是这并不能解释这种行为的根源(因此没有令人满意的解决scheme)。 所以我把这个打开。

无论是正常的重新启动,还是正常的重新启动。 我需要完全停止Apache,等待所有进程完成,然后再次启动Apache。 问题解决了。 由于没有人似乎find这种行为的根本原因的解释我接受我自己的解决scheme。

当从CLI运行时,这里同样可以,通过Apache运行时出错。 我想这与更改名称服务器有关,例如在/etc/resolv.conf中。 不知何故,Apache(其他程序也受到影响)不检查更改的名称服务器,无法parsing。 当我用笔记本电脑切换networking时,会发生这种情况。 我必须手动停止Apache,歌剧,火狐等,为了他们得到新的名称服务器设置。

从PHP.net的gethostbyname手册上的注释:

如果名称parsing失败与Apache2,mod_chroot和php5,将LoadFile /lib/libnss_dns.so.2添加到mod_chrootconfiguration。

在RedHat Linux的chroot环境中使用PHP和Apache时,我发现我需要绑定/ var / run / nscd才能使其工作。 显然,该目录中的套接字是所有DNS事物所需要的。