3

我正在使用运行 Apache2 / PHP5 的 OS X 10.6 服务器,并且在“fopen()”尝试从远程服务器检索文件时遇到 PHP 无法解析主机名的问题。在命令行上以交互模式运行时,“fopen()”可以完美运行。但是,当通过网络运行时,它总是会失败并出现错误:

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

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

我一直试图在服务器上查找 DNS 问题,但 dig、nslookup 和 ping 都可以正常工作,并且“scutil -r”表示可以使用当前 DNS 设置访问远程服务器。关于问题可能出在哪里的任何想法?

4

6 回答 6

3

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

于 2010-09-07T05:37:58.563 回答
2

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


2016 年 2 月更新

strace仅使用gethostbyname来自测试脚本@ https://knzl.de/setting-up-a-chroot-for-php/在Alpine Linux /dns中为我解决。我也使用这个链接来解决这个问题。nginx chrootshmini-sendmailmail


chroot 中 DNS 和邮件所需文件的大致列表

以下命令使 DNS 在 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

于 2014-08-16T03:20:54.653 回答
2

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

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

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

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

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

LoadFile /lib/libnss_dns.so
于 2010-02-08T17:46:57.937 回答
1

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

于 2014-08-17T07:39:18.950 回答
0

您尝试解析的主机名是什么?我在本地主机上遇到了同样的问题。

这没有用,我得到了你的错误。我将主机名更改为 127.0.0.1 比它起作用。不是最好的解决方案,但适合解决方法。

于 2014-02-06T11:09:33.160 回答
-1

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

于 2012-01-13T22:26:29.073 回答