在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);
?>你在其他平台上也有同样的问题吗?有什么办法解决这个问题吗?
发布于 2010-12-08 21:53:34
问题不在于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头不适用于HTTP1.0。它是在1.1中引入的。您还会看到,我将\n放在了最后一行。这是因为heredoc不会自动以新行结束字符串。
最后一件事,这是:
fsockopen($hostname, 80, &$errno, &$errstr);..。是错误的。它被称为调用时按引用传递,已被弃用。最好的方法是:
fsockopen($hostname, 80, $errno, $errstr);..。没有&的话。您将得到相同的结果,但不会触发任何错误(至少在5.3中)。
发布于 2010-12-08 21:47:27
你的代码在我的Ubuntu 10.10上生成了一个来自Apache的“Bad Request”。
我认为,这与请求中的行尾有关。将您的heredoc请求分配替换为以下工作:
$request = "GET / HTTP/1.0\r\n"
. "Hostname: $hostname\r\n"
. "Connection: close\r\n"
. "\r\n";
https://stackoverflow.com/questions/4387585
复制相似问题