68

这是我的代码片段

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

当我运行它时,它输出:

无法连接到 www.mydomain.net/1/file.php:80 (php_network_getaddresses: getaddrinfo failed: Name or service not known

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

我不知道为什么。任何帮助将不胜感激。

4

10 回答 10

38

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

如果您尝试访问远程 URL,那么file_get_contents()是您最好的选择。您可以为该函数提供完整的 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"); 

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

于 2010-04-18T08:11:56.670 回答
28

我在本地 testserver 和本地 testdomains 上遇到了类似的问题,例如: www.testdomain.loc with the function GetImageSize();

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

在文件/etc/hosts我添加:

192.168.1.1 www.testdomain.loc

希望这对任何人都有帮助

于 2012-10-20T09:35:30.273 回答
24

如果您只想向 URL 提交 GET 数据,您应该使用类似 file_get_contents() 的简单方法;

$myGetData = "?var1=val1&var2=val2";
file_get_contents($url.$myGetData);
于 2010-04-18T08:16:44.503 回答
10

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

对于 Centos 6 和 7:

service php-fpm restart 
于 2018-02-12T10:39:40.783 回答
4
$url = "http://user:pass@www.example.com/abc.php?var1=def";
$contents = file_get_contents($url);
echo $contents;
于 2013-03-24T15:07:36.337 回答
2

您正在尝试打开一个连接到远程主机上不正确文件的套接字。您可以与远程主机上的端口号建立套接字连接(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 的内容,但我不确定是否要写入。

编辑:从评论和其他答案中,我发现您想向指定的 URL 发送 HTTP 请求。此答案中描述的方法适用于您想要从远程 URL 接收数据时。如果要发送数据,可以使用http_request()来执行此操作。

于 2010-04-18T08:06:24.127 回答
2

我遇到了同样的 fsocket() 错误,我刚刚更新了我的主机文件

  1. 我通过 SSH 在 CentOS 服务器上登录。用户名和密码类型
  2. 光盘 /etc/
  3. ls //"只看列表"
  4. vi hosts //"编辑主机文件"
  5. i //"将文件置于插入模式"
  6. 95.183.24.10 [mail_server_name] 在我的情况下(“mail.kingologic.com”)
  7. 按 ESC 键
  8. 按ZZ

希望它能解决你的问题

如有任何进一步的疑问,请在http://kingologic.com上联系我

于 2016-02-26T15:03:31.677 回答
1

在我的情况下,这个错误是由 debian 上的错误 /etc/nsswitch.conf 配置引起的。

我已被替换字符串

hosts:          files myhostname mdns4_minimal [NOTFOUND=return] dns

hosts:          files dns

现在一切正常。

于 2016-11-10T07:34:05.293 回答
0

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

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

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

于 2015-06-06T06:40:55.000 回答
0

简而言之,您的网站已被阻止访问网络。可能是你自动化了一些脚本,它导致你的整个网站被阻止。解决此问题的更好方法是联系该站点并告知您的问题。如果问题是真实的,他们可能会考虑解除封锁

于 2017-07-23T13:18:15.307 回答