插座上的feof块

时间:2010-12-08 12:48:39

标签: php

在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);
?>

您在其他平台遇到同样的问题吗?有什么想法解决它?

2 个答案:

答案 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";