我正在使用运行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设置访问。关于问题可能在哪里的任何想法?
答案 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
问题。
以下命令让我在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。