PHP5 - 未处于交互模式时无法解析主机名

时间:2010-02-08 17:43:19

标签: php macos apache2 dns hostname

我正在使用运行Apache2 / PHP5的OS X 10.6服务器,当'fopen()尝试从远程服务器检索文件时,PHP无法解析主机名。在命令行'fopen()'上以交互模式运行时,效果非常好。但是,当通过Web运行时,它将始终失败并显示错误:

failed to open stream: php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known

我找不到这个问题的根源:'fopen()'在给定IP地址而不是主机名时在网络上工作; 'gethostbyname()'在Web上运行时也会失败(它没有错误,它只返回给出的任何主机名来解析),但在交互模式下运行时也能正常工作。唯一的例外似乎是'dns_get_record()',它在网络上或交互模式下运行时效果很好。

我一直在尝试在服务器上查找DNS问题但是挖掘,nslookup和ping所有工作,“scutil -r”表示远程服务器可以通过当前的DNS设置访问。关于问题可能在哪里的任何想法?

6 个答案:

答案 0 :(得分:3)

尝试使用'--disable-ipv6'选项重新编译PHP。然后,apachectl停止&启动(不是'apachectl restart')。我在Mac OS 10.6.4 +手动编译的PHP5.3.3 + Apache2.2.16上有相同的错误消息。

答案 1 :(得分:2)

您必须正确设置php.ini的allow_url_fopen值。

http://ar.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen

考虑CLI使用与Web服务器不同的php.ini(我假设您使用的是Apache)。

另一种选择可能是你不包括libnss_dns

尝试添加到httpd配置(系统需要的正确路径):

LoadFile /lib/libnss_dns.so

答案 2 :(得分:2)

如果你正在使用chroot设置运行PHP-FPM(你应该这样) - 那么DNS和邮件都不会起作用。


2016年2月更新

strace仅使用{strong> 测试脚本 @ https://knzl.de/setting-up-a-chroot-for-php/ gethostbyname为我解决dns Alpine Linux / nginx chroot。我还使用此sh链接中的mini-sendmail来解决mail问题。


DNS & Mail in a chroot

所需文件的近似列表

以下命令让我在Debian上使用PHP5.5为我工作(使用Joomla内置更新组件测试):

#!/bin/sh

chroot=/var/www
domain=mydomain
webuser=www-data
webgroup=www-data

cd $chroot/$domain

mkdir etc

cp /etc/resolv.conf etc/
cp /etc/nsswitch.conf etc/
echo $(cat /etc/group|grep $webgroup) > etc/group
echo $(cat /etc/passwd|grep $webuser) > etc/passwd
cp /etc/services etc/
cp /etc/protocols etc/
cp /etc/host.conf etc/
cp /etc/hosts etc/
cp /etc/networks etc/

mkdir -p usr/bin   
mkdir usr/sbin

cp /usr/sbin/ssmtp usr/sbin/
cp /usr/sbin/sendmail usr/sbin/

mkdir usr/share

cp -rf /usr/share/zoneinfo usr/share

mkdir lib

cp /lib/i386-linux-gnu/libresolv.so.2 lib/
cp /lib/i386-linux-gnu/libnss_compat.so.2 lib/
cp /lib/i386-linux-gnu/libc.so.6 lib/
cp /lib/i386-linux-gnu/libnsl.so.1 lib/
cp /lib/i386-linux-gnu/libnss_files.so.2 lib/
cp /lib/i386-linux-gnu/libz.so.1 lib/
cp /lib/i386-linux-gnu/libdl.so.2 lib/
cp /lib/i386-linux-gnu/libcidn.so.1 lib/
cp /lib/i386-linux-gnu/ld-linux.so.2 lib/
cp /lib/i386-linux-gnu/libcrypt.so.1 lib/
cp /lib/i386-linux-gnu/libnss_nis.so.2 lib/
cp /lib/i386-linux-gnu/libnss_dns.so.2 lib/

chown -R $webuser:$webgroup lib usr etc
service php5-fpm restart

我不需要/ bin / sh或/ usr / lib / locale

答案 3 :(得分:1)

同样的问题,不同的解决方案然后是原始的海报。我正在调用mysqli(...)来连接,但是我为服务器提供的URL是错误的。所以它并不总是意味着你无法进行任何DNS查找,只是因为服务器无法进行特定的查找(检查你的主机!)

答案 4 :(得分:0)

您尝试解决的主机名是什么?我对localhost也有同样的问题。

这没用,我得到了你的错误。我将主机名更改为127.0.0.1而不是它的工作。不是最好的解决方案,但对于解决方法很有用。

答案 5 :(得分:-1)

在网络首选项中禁用TCP / IP配置中的IPv6。