无法在Apache下使用PHP解析域名

5
我对这个问题束手无策了。我的一个服务器(Amazon ec2 实例)上运行着 Apache,但我似乎无法在 PHP 中解析域名。例如,fopen('http://www.google.com', 'r') 会抛出“php_network_getaddresses: getaddrinfo failed: Name or service not known”错误,但如果我将 URL 更改为 Google 的某个 IP 地址,则可以正常工作。在远程服务器上 ping www.google.com 也没问题,因此我知道它不是“外部系统”的问题。
奇怪的是,我已经让这台服务器运行了一段时间而没有遇到任何问题,我无法想到自己做过什么可能会导致这种情况发生。
在我的 php.ini 文件中,allow_url_fopen = On,为了确保它被应用,我从同一脚本中运行了 phpinfo(),并且 allow_url_fopen 确实已经打开了。
还有什么其他的建议吗?是否可能是某种文件权限问题导致这个问题?因为我确实在我的 Web 应用程序内更改了一些文件权限,我可能会输错东西,并意外更改应用程序之外的某些文件的权限/所有权。虽然这种可能性很小,但我无法想到我在系统上做了什么会导致它停止工作。

如果我在服务器上从命令行运行php脚本,域名可以正常解析,所以我猜这可能与Apache有关? - user1585789
我在网上找到了很多人遇到同样的问题。对于大多数人来说,重新启动服务器可以解决问题,但对我来说不行。对于其他人来说,这可能是权限问题,但我确保每个人都有/etc/resolv.conf的读取权限,并且我无论如何都在以root身份运行Apache... - user1585789
Apache或内核日志中有什么吗?或者作为解决方法,您可以使用net_dns2PHPDNS进行自己的DNS查找。 - klugerama
SELinux策略怎么样?setsebool -P nis_enabled 1setsebool -P httpd_can_network_connect 1 - Charlie Schliesser
6个回答

5

我曾经也遇到过同样的问题。

在执行httpd重启后,主机解析问题仍然存在。 但是使用httpd停止和启动对我来说解决了这个问题。


谢谢,这也解决了我的一个问题。service https graceful 没有帮助,但是停止和启动却奏效了。有人知道为什么吗? - Stian Martinsen

3
如果您有权限,请尝试将/etc/resolv.conf文件中的名称服务器更改为其他名称服务器。可能是您的DNS缓存过期了,或者尝试通过在终端中运行以下命令来更改SE Linux策略:
setsebool -P nis_enabled 1
setsebool -P httpd_can_network_connect 1

1

我在开发中遇到了同样的问题,只有在apache下执行php时才会出现,但是直接使用php则可以正常工作!

php filetest.php

然后我检查了我的apache状态,发现日志中有以下内容:
Mar 12 13:01:08 arch-linux apachectl[6847]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::6aa3:c4ff:fe...is message

经过一些搜索,我找到了它:

http://tutorialforlinux.blogspot.com.br/2013/10/solve-problem-ah00558-when-restarting.html

这正是问题所在,然后我在我的httpd.conf中进行了更改:

#ServerName www.example.com:80

To this:

ServerName localhost

它可以工作了,现在我可以在Apache下使用PHP解析DNS。

对不起,我的英语不好,我想详细说明一下。


1

你确定是因为Apache吗?我会首先在终端中运行以下脚本。你应该可以看到所有的HTML文本被打印出来:

<?php
$handle = @fopen("http://www.google.com", "r");
if ($handle) {
    while (($buffer = fgets($handle, 4096)) !== false) {
        echo $buffer;
    }
    if (!feof($handle)) {
        echo "Error: unexpected fgets() fail\n";
    }
    fclose($handle);
}

如果那不起作用,下一步是检查您的DNS解析器是否正常工作。输出是什么?

host www.google.com

完成这两个测试后,我们可以决定前进的方向。


谢谢,我已经运行了一个等效的测试。从命令行中运行带有fopen的php脚本将正常工作。通过apache运行相同的脚本会失败并显示“php_network_getaddresses:getaddrinfo failed:Name or service not known”。 - user1585789
尝试切换到cUrl。一些getaddrinfo的实现存在问题。 - pgampe

0
你可以尝试使用file_get_contents函数:
file_get_contents('http://www.google.com');

fopenfile_get_contents几乎是等效的,但在服务器上的配置不同的情况下,它们并不总是都能正常工作。


谢谢,但这不是我要让它工作的应用程序。phpmyadmin、adminer、sqlbuddy或任何MySQL管理程序都无法访问我正在尝试连接的远程数据库。 - user1585789

0

(抱歉,我没有足够的声望来添加评论)。在我看来,这可能与在chroot环境中运行Apache有关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接