file_get_contents返回空字符串

You*_*nse 21 php fopen

我对这个问题犹豫不决,因为它看起来很奇怪.但无论如何.万一有人遇到过同样的问题......文件系统函数(fopem,file,file_get_contents)对于http:// wrapper表现得很奇怪

  • 它似乎有效.没有错误提出.fopen()返回资源.
  • 它不返回所有肯定工作的URL的数据(例如http://google.com/).
    file返回空数组,file_get_contents()返回空字符串,fread返回false
  • 对于所有故意错误的URL(例如http://goog973jd23le.com/)它的行为完全相同,除了少量[假设域查找]超时,之后我没有得到任何错误(应该!)但是空字符串.
  • url_fopen_wrapper已开启
  • curl(命令行和php版本)工作正常,所有其他实用程序和应用程序工作正常,本地文件打开正常

此错误似乎不适用,因为在我的情况下,它不适用于每个URL或主机.

php-fpm 5.2.11 Linux版本2.6.35.6-48.fc14.i686(mockbuild@x86-18.phx2.fedoraproject.org)

Eri*_*ron 23

我通过从PHP配置中删除--with-curlwrapper并重建它来修复我的服务器上的这个问题(在Fedora 14上运行PHP 5.3.3).


mar*_*rio 15

听起来像个臭虫.但是对于后代来说,这里有一些你可能想要调试的东西.

  • allow_url_fopen:已经测试过
  • Apache下的PHP可能与PHP-CLI的行为不同,并暗示chroot/selinux/fastcgi/etc.安全限制
  • 本地防火墙:自卷曲起作用的可能性不大
  • 用户代理阻止:实际上这很常见,网站会阻止抓取工具和未知客户端
  • 来自您的ISP的透明代理,无论是破坏还是阻止(PHP用户代理或非用户代理都可能被解释为恶意软件)
  • PHP流包装器问题

无论如何,首先让我们证明PHP流处理程序是有用的:

<?php
     if (!file_get_contents("data:,ok")) {
          die("Houston, we have a stream wrapper problem.");
     }
Run Code Online (Sandbox Code Playgroud)

然后尝试看看PHP是否真的发出了真正的HTTP请求.首先在控制台上打开netcat:

nc -l 80000
Run Code Online (Sandbox Code Playgroud)

只需调试:

<?php
    print file_get_contents("http://localhost:8000/hello");
Run Code Online (Sandbox Code Playgroud)

从这里你可以尝试与PHP通信,看看如果你改变响应有什么返回.首先在netcat中输入无效响应.如果没有抛出错误,那么你的PHP包就会被破坏.

(您也可以尝试通过"tcp:// .."句柄进行通信.)

接下来是试验http流包装器参数.使用http://example.com/字面意思,已知它可以工作,永远不会阻止用户代理.

$context = stream_context_create(array("http"=>array(
    "method" => "GET",
    "header" => "Accept: xml/*, text/*, */*\r\n",
    "ignore_errors" => false,
    "timeout" => 50,
));

print file_get_contents("http://www.example.com/", false, $context, 0, 1000);
Run Code Online (Sandbox Code Playgroud)

我认为ignore_errors在这里非常重要.但请查看http://www.php.net/manual/en/context.http.php并特别尝试设置protocol_version为1.1(将获得分块和误解的响应,但至少我们会看到是否有任何返回).

如果即使这仍然不成功,那么尝试破解http包装器.

<?php
    ini_set("user_agent" , "Mozilla/3.0\r\nAccept: */*\r\nX-Padding: Foo");
Run Code Online (Sandbox Code Playgroud)

这不仅会设置User-Agent,还会注入额外的标头.如果在http流包装器中构造请求的处理问题,那么这最终可能会捕获它.

否则尝试禁用任何Zend扩展,Suhosin,PHP xdebug,APC和其他核心模块.可能存在干扰.否则,这可能是Fedora软件包特有的问题.尝试新版本,看看它是否仍然存在于您的系统上.


Jer*_*emy 5

当您使用http流包装器时,PHP将为您创建一个在调用(或其他f系列功能中的任何一个)函数$http_response_header之后的数组file_get_contents()。这包含有关响应状态的有用信息。您可以var_dump()对此数组做一个,看看它是否为您提供有关响应的更多信息吗?

这是一个非常奇怪的错误。我唯一能想到的是,服务器上的其他内容正在阻止来自PHP的http请求,但是我不明白为什么cURL仍然可以...

  • http_header_response 上的 var_dump 给出了一个 NULL。 (2认同)