php_network_getaddresses:getaddrinfo failed:名称或服务未知

Rob*_*Rob 60 php fsockopen

这是我的代码片段

$fp = fsockopen($s['url'], 80, $errno, $errstr, 5);
if($fp){
        fwrite($fp, $out);
        fclose($fp);
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它输出:

无法连接到www.mydomain.net/1/file.php:80(php_network_getaddresses:getaddrinfo失败:名称或服务未知

我正在使用它来提交GET数据 $s['url']

我无法弄清楚为什么.任何帮助将不胜感激.

zom*_*bat 36

您无法使用直接打开远程主机上的路径的连接fsockopen.www.mydomain.net/1/file.php当第一个参数的唯一有效值是主机时,url 包含路径www.mydomain.net.

如果您尝试访问远程URL,则file_get_contents()是您最好的选择.您可以提供该功能的完整URL,它将使用正常的HTTP请求获取该位置的内容.

如果你只想发送一个HTTP请求,而忽略了响应,你可以使用fsockopen()和手动发送HTTP请求头,忽略任何响应.这可能是与更容易卷曲,虽然,或只是普通的老fopen()函数,这将打开连接,但不一定读任何回应.如果你想用它fsockopen(),它可能看起来像这样:

$fp = fsockopen("www.mydomain.net", 80, $errno, $errstr, 30);
fputs($fp, "GET /1/file.php HTTP/1.1\n");
fputs($fp, "Host: www.mydomain.net\n");
fputs($fp, "Connection: close\n\n"); 
Run Code Online (Sandbox Code Playgroud)

当然,这会给您带来任何错误处理,但这意味着您不会浪费时间阅读响应.

  • @Rob - elias 是对的,你可以忽略返回值。如果您担心发出完整 HTTP 请求的开销(可能不多,除非该 URL 返回大量信息),我使用手动发送 HTTP 请求标头的粗略“fsockopen()”方法更新了我的答案。 (2认同)

小智 23

我在本地测试服务器和本地testdomains上遇到了类似的问题,例如:带有该功能的www.testdomain.loc GetImageSize();

通过在本地服务器上的hosts文件中添加主机名来解决此问题:

在文件/ etc/hosts中我添加了:

192.168.1.1 www.testdomain.loc
Run Code Online (Sandbox Code Playgroud)

希望这有助于任何人


eli*_*ias 21

如果您只想将GET数据提交到URL,您应该使用像file_get_contents()这样简单的东西;

$myGetData = "?var1=val1&var2=val2";
file_get_contents($url.$myGetData);
Run Code Online (Sandbox Code Playgroud)

  • 这是代码问题的替代解决方案,但没有解决底层基础设施问题(DNS查找失败.)因为我在Drupal中遇到同样的问题,黑客攻击别人的贡献项目对我来说是一个不合适的选择:相反,我可以在这个线程中推荐另一个答案,涉及/ etc/hosts,这确实修复了我的DNS. (6认同)
  • 欢迎来到PHP xD的简单世界 (3认同)

San*_*nex 5

遇到了这样的问题(使用https://github.com/PHPMailer/PHPMailer),只需重新加载PHP即可开始一切正常

对于Centos 6和7:

service php-fpm restart 
Run Code Online (Sandbox Code Playgroud)