我不太愿意问这个问题,因为它看起来很奇怪。但不管怎样。以防有人已经遇到了同样的问题...文件系统函数(fopem、file、file_get_contents)的行为非常奇怪
http://google.com/
)返回数据。文件返回空数组,file_get_contents()返回空字符串,fread返回false
http://goog973jd23le.com/
)它的行为完全相同,除了很少的所谓的域查找超时,在此之后我没有得到任何错误(而应该!)但空的string.
This error似乎不适用,因为在我的例子中,它并不适用于所有的url或主机。
php-fpm 5.2.11 Linux版本2.6.35.6-48.fc14.i686 (mockbuild@x86-18.phx2.fedoraproject.org)
发布于 2010-12-09 12:51:33
我在我的服务器(在Fedora 14上运行PHP 5.3.3 )上修复了这个问题,方法是从PHP配置中删除--with-curlwrapper并重新构建它。
发布于 2010-11-23 04:29:04
听起来像是窃听器。但仅供后人参考,这里有一些您可能想要调试的东西。
allow_url_fopen
:已经测试过的restrictions无论如何,首先让我们证明PHPs流处理程序是有效的:
<?php
if (!file_get_contents("data:,ok")) {
die("Houston, we have a stream wrapper problem.");
}
然后尝试查看PHP是否发出真正的HTTP请求。首先在控制台上打开netcat:
nc -l 80000
调试时只需:
<?php
print file_get_contents("http://localhost:8000/hello");
从这里你可以尝试与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);
我认为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");
这不仅会设置User-Agent,还会注入额外的标头。
否则,尝试禁用任何Zend扩展,Suhosin,PHP,APC和其他核心模块。可能会有干扰。否则,这可能是特定于Fedora包的问题。尝试一个新版本,看看它是否会在您的系统上持续存在。
发布于 2010-11-13 22:29:40
当您使用http流包装器时,PHP会在file_get_contents()
(或任何其他f系列函数)被调用之后创建一个名为$http_response_header
的数组。它包含有关响应状态的有用信息。你能对这个数组做一个var_dump()
,看看它是否给了你更多关于响应的信息吗?
这是一个非常奇怪的错误。我唯一能想到的就是服务器上的其他东西阻塞了来自PHP的http请求,但是我不明白为什么cURL仍然可以……
https://stackoverflow.com/questions/4172860
复制相似问题