2012-02-20 41 views
0

私は、必要に応じて、HTTP応答ヘッダーとfsockを使用してGET要求の内容の両方を取得するために、スクリプトを設定しました。PHPでfsockopenのHTTPヘッダーを解析しますか?

function checkUrl($host,$url,$port) { 
$fp = fsockopen($host, $port, $errno, $errstr, 10); 
if (!$fp) { 
    echo "$errstr ($errno)<br />\n"; 
} else { 
    $out = "GET $url HTTP/1.1\r\n"; 
    $out .= "Host: $host\r\n"; 
    $out .= "Connection: Close\r\n\r\n"; 
    fwrite($fp, $out); 
    while (!feof($fp)) { 
     $response = fgets($fp, 1024); 
     print(substr($response,9,3)); 
    } 
    fclose($fp); 
} 
} 

私は単純にすべてをエコーすると、それを呼び出してすべての適切なデータを取得します。しかし、実際に私が関数から返す必要があるのは、HTTP STATUSコードだけです。

すなわち404または200または301など

しかし、上記のコードは必ず、その後私は3つの文字に制限されてきたとき、私は理解していない最後のちんぷんかんぷんの負荷でエラーコードを提供します!

404, 2BM_n: Encype HThe tp-me=srcsrclanstaPre> lanmg=[0][1][2][3][4][5][6][7][8][9][10[11[12 swt.i> ypeeleamiize#99eco#66ade#33izeine#CCize { #66izeeig tmardespath=th=th=th=th=th=th=spardeolordeignign bocol widwidwid col bler> td Sorabl> e> rdeolordespath=th=th= bo spardeoloe="lanSen> 

私の反応は実際には文字列の右よりも複雑だと私は信じていますか?ヘッダーに特別なものがあるのですか、あるいはfgetsの仕組みを誤解していますか?何か助けをたくさんいただきました

答えて

1

の部分文字列を印刷するのは、最初の文字列ではなく、のブロックです。解決策は、ループを行わないことです。これを変更します。

while (!feof($fp)) { 
    $response = fgets($fp, 1024); 
    print(substr($response,9,3)); 
} 

にちょうどこの:

$response = fgets($fp, 1024); 
print(substr($response,9,3)); 

あるいは単にこれ、本当に、あなただけの最初の13文字ではなく、最初の1024必要があるので:

$response = fgets($fp, 13); 
print(substr($response,9,3)); 
+0

あなたは絶対に正しいです、私の部分を考えています:)ブラウザのようにフルページを取得して適切にコンパイルすることが重要なので、ファイル全体を処理する必要があると考えていました。 – Seer

2

でのあなたが最初の行だけに興味があるとしても、ヘッダー/応答の各行を繰り返している瞬間です。代わりにこれを試してみてください:

while (!feof($fp)) { 
    $response = fgets($fp, 1024); 
    $code = substr($response,9,3); 
    if (is_numeric($code)) { 
     $break; 
    } 
} 

// $code should contain the response code 

あなたは私があなたの代わりにGET 1のHEAD要求を行うことをお勧めしたい応答ヘッダーだけに興味があるとされていない場合。

本当に魅力的な理由がない限り、PHPアプリケーションロジック内のすべての低レベルのものを処理しようとするのではなく、CURLを使用してこのリクエストを行うことをお勧めします。

+0

はい私はカールオプションを数回見ましたが、コードは基本的にサーバーを暖かくして、たくさんのヒット/秒にリリースする準備ができています。ソケットのオープンは、ロードバランサは他のものと一緒に最初からうまく動作します。そして私はページの内容をすべて取得する必要があります。そうしないとサーブレットが初期化されるわけではありません。つまり、一般公開するとすぐにクラッシュします。 – Seer

+0

OK - これは驚くべきことです。なぜCURL/rawソケットが異なる動作をするのかという科学的な理由は見当たりません。 CURLを介した要求は、ソケットを作成し、それに要求を書き込んだ後、まったく同じ方法で応答を読み取る必要があります。 –

関連する問題