Getaddrinfo 失败: 名称或服务未知

下面是我的代码片段

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

当我运行它时,它输出:

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

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

我不知道为什么,如果你能帮忙,我将不胜感激。

479990 次浏览

您正在尝试打开一个套接字到远程主机上的一个文件,这是不正确的。您可以将套接字连接(TCP/UDP)连接到远程主机上的端口号。所以你的代码应该是这样的:

fsockopen('www.mysite.com', 80);

如果要创建指向远程文件的文件指针资源,可以使用 fopen ()函数。但是要做到这一点,还需要指定应用程序协议。

PHP 为打开 URL 文件提供默认的流包装器。根据 URL 的模式,将在内部调用适当的流包装器。您试图打开的 URL 没有此解决方案的有效架构。确保其中包含类似“ http://”或“ ftp://”的模式。

所以代码是这样的:

$fp = fopen('http://www.mysite.com/path/file.txt');

此外,我认为 HTTP 流包装器(用于处理对具有 HTTP 模式的 URL 上的文件资源的操作)不支持数据写入。您可以使用 fread ()通过 HTTP 读取 URL 的内容,但我不确定是否要写。

编辑: 从评论和其他答案,我认为你会想要发送一个 HTTP 请求到指定的 URL。 本答案中描述的方法用于从远程 URL 接收数据的时候。如果要发送数据,可以使用 http_request()进行此操作。

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

如果您试图访问远程 URL,那么 File _ get _ content ()是最佳选择。您可以为该函数提供一个完整的 URL,它将使用普通的 HTTP 请求获取该位置的内容。

如果只想发送 HTTP 请求而忽略响应,则 可以使用 fsockopen()并手动发送 HTTP 请求标头,忽略任何响应。使用 CURL可能更容易,或者仅仅使用老式的 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");

当然,这就把任何错误处理留给了您,但这意味着您不会浪费时间读取响应。

如果您只想向 URL 提交 GET 数据,那么应该使用 file _ GET _ content ()等简单的方法;

$myGetData = "?var1=val1&var2=val2";
file_get_contents($url.$myGetData);

我在本地测试服务器和本地测试域上遇到过类似的问题,例如: Www.testdomain.loc和函数 GetImageSize();

通过在本地服务器的 hosts 文件中添加主机名解决了这个问题:

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

192.168.1.1 www.testdomain.loc
$url = "http://user:pass@www.example.com/abc.php?var1=def";
$contents = file_get_contents($url);
echo $contents;

尝试设置 ENV 路径。将 PHP 路径添加到 ENV PATH。

为了使此扩展能够工作,必须有一些 DLL 文件可用于 Windows 系统 PATH。有关如何做到这一点的信息,请参阅标题为“如何将我的 PHP 目录添加到 Windows 上的 PATH”的常见问题。虽然将 DLL 文件从 PHP 文件夹复制到 Windows 系统目录也可以工作(因为系统目录默认为系统的 PATH) ,但是不建议这样做。此扩展要求 PATH 中包含以下文件: libeay32.dll

Http://php.net/manual/en/openssl.installation.php

我得到了相同的 fsocket ()错误,我只是更新了我的主机文件

  1. 我在 CentOS 服务器上通过 SSH 登录 类型
  2. Cd/etc/
  3. Ls//“只是观察名单”
  4. Vi hosts//“ edit the host file”
  5. “将文件放入插入模式”
  6. 95.183.24.10[ mail _ server _ name ](“ mail.kingologic.com”)
  7. 按 ESC 键
  8. 按 ZZ 键

希望这能解决你的问题

如果有任何进一步的问题,请通过 http://kingologic.com联系我

在我的例子中,这个错误是由 debian 上错误的/etc/nsswitch.conf 配置引起的。

我被换成了绳子

hosts:          files myhostname mdns4_minimal [NOTFOUND=return] dns

hosts:          files dns

现在一切正常。

简而言之,您的网站已被阻止访问网络。可能是你已经自动化了一些脚本,它造成你的整个网站被封锁。解决这个问题的更好办法是联系那个网站,告诉你的问题。如果问题是真实的,他们可能会考虑解除封锁

有这样一个问题(与 https://github.com/PHPMailer/PHPMailer) ,只是重新加载 PHP 和一切开始工作

为森托斯6和7:

service php-fpm restart

我在连接本地 MySQL 数据库时也遇到过类似的问题,只是更改了 ip 地址127.0.0.1的 URL,而且还能正常工作。您可以更改服务器 IP 地址的 URL。