在Mac OS X上,以下feof()调用永远不会返回。
<?php
$hostname = "localhost";
$fh = fsockopen($hostname, 80, &$errno, &$errstr);
if ($errno) {
print $errstr;
exit;
}
$request = <<<request
GET / HTTP/1.0
Host: $hostname
Connection: close
request;
fputs($fh,$request);
while (!feof($fh))
echo fgets($fh);
fclose($fh);
?>
您在其他平台遇到同样的问题吗?有什么想法解决它?
答案 0 :(得分:1)
问题不在于feof
,而是您的请求未按正确方式格式化。您可能知道,类Unix系统使用\n
作为换行符。但是,HTTP中的新行是\r\n
。您需要更改您的请求:
$request = <<<request
GET / HTTP/1.1\r
Host: $hostname\r
Connection: close\r
\r\n
request;
另请注意,我使用了HTTP/1.1
,因为Host
标头不适用于HTTP 1.0。它是在1.1中引入的。您还会看到我已将\n
放在最后一行。这是因为heredoc不会自动以新行结束字符串。
最后一件事,这个:
fsockopen($hostname, 80, &$errno, &$errstr);
......错了。它被称为呼叫时传递引用,不推荐使用。好方法是:
fsockopen($hostname, 80, $errno, $errstr);
...没有&
。您将获得相同的结果,但不会触发任何错误(至少在5.3中)。
答案 1 :(得分:0)
您的代码在我的Ubuntu 10.10上从Apache生成“错误请求”。
我认为,这与您的请求中的行结尾有关。用以下工作替换你的heredoc请求分配:
$request = "GET / HTTP/1.0\r\n"
. "Hostname: $hostname\r\n"
. "Connection: close\r\n"
. "\r\n";
$request = "GET / HTTP/1.0\r\n"
. "Hostname: $hostname\r\n"
. "Connection: close\r\n"
. "\r\n";