首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >file_get_contents返回空字符串

file_get_contents返回空字符串
EN

Stack Overflow用户
提问于 2010-11-13 22:00:35
回答 7查看 59.8K关注 0票数 24

我不太愿意问这个问题,因为它看起来很奇怪。但不管怎样。以防有人已经遇到了同样的问题...文件系统函数(fopem、file、file_get_contents)的行为非常奇怪

  • 它似乎起作用了。未引发错误。fopen()返回资源。
  • 它不会为所有正常工作的urls (例如http://google.com/)返回数据。

文件返回空数组,file_get_contents()返回空字符串,fread返回false

  • 对于所有故意错误的urls (例如http://goog973jd23le.com/)它的行为完全相同,除了很少的所谓的域查找超时,在此之后我没有得到任何错误(而应该!)但空的string.

  • url_fopen_wrapper是变成的on

  • curl (命令行和php版本)运行良好,所有其他实用程序和应用程序运行良好,本地文件打开良好

This error似乎不适用,因为在我的例子中,它并不适用于所有的url或主机。

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-12-09 12:51:33

我在我的服务器(在Fedora 14上运行PHP 5.3.3 )上修复了这个问题,方法是从PHP配置中删除--with-curlwrapper并重新构建它。

票数 23
EN

Stack Overflow用户

发布于 2010-11-23 04:29:04

听起来像是窃听器。但仅供后人参考,这里有一些您可能想要调试的东西。

  • allow_url_fopen:已经测试过的restrictions
  • local
  • PHP在Apache下的表现可能与PHP-CLI不同,并且会提示chroot/selinux/fastcgi等安全问题防火墙:不太可能,因为curl works
  • user-agent阻止:这是相当常见的实际上,网站阻止爬虫程序和来自ISP的未知clients
  • transparent代理,它们损坏或阻塞(PHP用户代理或非用户代理可能被解释为恶意软件)
  • PHP流包装问题

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

代码语言:javascript
复制
<?php
     if (!file_get_contents("data:,ok")) {
          die("Houston, we have a stream wrapper problem.");
     }

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

代码语言:javascript
复制
nc -l 80000

调试时只需:

代码语言:javascript
复制
<?php
    print file_get_contents("http://localhost:8000/hello");

从这里你可以尝试与PHP通信,看看如果你改变了响应,是否会有什么结果。首先在netcat中输入无效的响应。如果没有抛出错误,那么你的PHP包就被锁定了。

(您也可以尝试通过"tcp://..“然后处理。)

下一步是尝试使用http流包装器参数。从字面上使用http://example.com/,众所周知,它是有效的,并且永远不会阻止用户代理。

代码语言:javascript
复制
$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);

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

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

代码语言:javascript
复制
<?php
    ini_set("user_agent" , "Mozilla/3.0\r\nAccept: */*\r\nX-Padding: Foo");

这不仅会设置User-Agent,还会注入额外的标头。

否则,尝试禁用任何Zend扩展,Suhosin,PHP,APC和其他核心模块。可能会有干扰。否则,这可能是特定于Fedora包的问题。尝试一个新版本,看看它是否会在您的系统上持续存在。

票数 19
EN

Stack Overflow用户

发布于 2010-11-13 22:29:40

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

这是一个非常奇怪的错误。我唯一能想到的就是服务器上的其他东西阻塞了来自PHP的http请求,但是我不明白为什么cURL仍然可以……

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4172860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档