我对这个问题犹豫不决,因为它看起来很奇怪.但无论如何.万一有人遇到过同样的问题......文件系统函数(fopem,file,file_get_contents)对于http:// wrapper表现得很奇怪
http://google.com/).http://goog973jd23le.com/)它的行为完全相同,除了少量[假设域查找]超时,之后我没有得到任何错误(应该!)但是空字符串.此错误似乎不适用,因为在我的情况下,它不适用于每个URL或主机.
php-fpm 5.2.11 Linux版本2.6.35.6-48.fc14.i686(mockbuild@x86-18.phx2.fedoraproject.org)
mar*_*rio 15
听起来像个臭虫.但是对于后代来说,这里有一些你可能想要调试的东西.
allow_url_fopen:已经测试过无论如何,首先让我们证明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软件包特有的问题.尝试新版本,看看它是否仍然存在于您的系统上.
当您使用http流包装器时,PHP将为您创建一个在调用(或其他f系列功能中的任何一个)函数$http_response_header之后的数组file_get_contents()。这包含有关响应状态的有用信息。您可以var_dump()对此数组做一个,看看它是否为您提供有关响应的更多信息吗?
这是一个非常奇怪的错误。我唯一能想到的是,服务器上的其他内容正在阻止来自PHP的http请求,但是我不明白为什么cURL仍然可以...