2010-12-08 14 views
0

Mac OS Xでは、次のfeof()呼び出しは返されません。ソケット上の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); 
?> 

他のプラットフォームでも同じ問題がありますか?それを解決するための任意のアイデア?

答えて

1

問題がfeofではありませんが、それは適切な方法でフォーマットされていないあなたの要求です。ご存じのように、Unixライクなシステムでは改行に\nを使用しています。しかし、HTTPの新しい行は\r\nです。あなたはあなたの要求を変更する必要があります。

また
$request = <<<request 
GET/HTTP/1.1\r 
Host: $hostname\r 
Connection: close\r 
\r\n 
request; 

HostヘッダがHTTP 1.0には適用されませんので、私はHTTP/1.1を使用しましたことに注意してください。それは1.1で導入されました。最後の行に\nと書いてあります。それはheredocが文字列を新しい行で自動的に終了しないからです。

最後に一つ、この:

fsockopen($hostname, 80, &$errno, &$errstr); 

は...間違っています。それはと呼ばれ、コール時に参照渡しとなり、推奨されなくなりました。良い方法は次のとおりです。

...なし&です。同じ結果が得られますが、少なくとも5.3ではエラーは発生しません。

0

あなたのコードは、私のUbuntu 10.10でApacheから「Bad Request」を生成します。

これは私の思うように、あなたの要求の行末と関係があります。以下の作品であなたのヒアドキュメント要求の割り当ての交換:

$request = "GET/HTTP/1.0\r\n" 
     . "Hostname: $hostname\r\n" 
     . "Connection: close\r\n" 
     . "\r\n"; 

関連する問題