- 締切済み
HTTP通信の詳細を知りたい
PHPで他ドメインのページの情報を取得しています。 その際に、HTTP通信のリクエストヘッダ、レスポンスヘッダの詳細を見たいです。 イメージとしては、firefoxの「firebug」とか「live http header」で取得できる情報量がほしいです。 現在、http通信でhttp_clientを使っています。 http_clientのcurrentResponse()でレスポンスは取得できるのですが、 クッキー情報などが入っていないです。 一番知りたいのは、リクエストヘッダです。 PHPを設置しているサーバーからどのようなリクエストヘッダを送っているのかを知りたいです。 というのは、設置しているサーバーによって同じページにリクエストを送っているのに、返ってくる情報が変わるときがあります。 PHPプログラムは全く同じです。 サーバーはさくらインターネットの共有サーバーを3つ契約しており、 3つのサーバーに同じプログラムを置いてHTTP通信しているのですが、 取得できる情報が異なっていて困っています。 恐らく、リクエストの何かが違っていると思うのでそれを調べたいと思って 質問しました。 そもそも原因が違うところにありそうであればアドバイスもお願いします。 よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
HTTP_Clientにそこまでの機能が実装されていないのであれば別の方法を検討しなければなりません。 一番原始的な方法が、fsockopen関数やstream_socket_client関数で作成したコネクションリソースを使って、リクエストヘッダの書き込みやレスポンスヘッダとレスポンスボディの読み取りを行っていく方法です。 PHP Manual - fsockopen ・通常接続 → ホスト名をそのまま使う ・SSL接続 → ホスト名に ssl:// を付加する http://us3.php.net/manual/ja/function.fsockopen.php PHP Manual - stream_socket_client ・通常接続 → ホスト名に tcp:// を付加する ・SSL接続 → ホスト名に ssl:// を付加する ・非同期接続に対応 http://us3.php.net/manual/ja/function.stream-socket-client.php 特に拘りが無ければfsockopenでいいと思います。手順としては以下のようになります。 1. fsockopenでリソースを作成して接続 2. fwriteでリクエストヘッダーを書き込む(改行コードは\r\n) 3. stream_get_contentsでレスポンスヘッダとレスポンスボディを読み込む(初めて\r\n\r\nが出現する場所で分割する) コードにするとこんな感じでしょうか。リクエストヘッダは最後に\r\n\r\nが出現するように空行を入れて調整してください。 if ($fp = @fsockopen('example.com', 80)) { fwrite($fp, implode("\r\n", array( 'GET /index.php HTTP/1.1', 'Host: example.com', 'Connection: close', '', '', ))); list($header, $body) = explode("\r\n\r\n", stream_get_contents($fp), 2) + array(1 => ''), ; var_dump($header, $body); fclose($fp); } else { $error = error_get_last(); die('Error: ' . $error['message']); } 「HTTP通信の内容を覗きたいっていったじゃん!」 「代わりの方法なんて聞いてねーよ!」 って思われるかもしれませんが、HTTP_Clientが内部で使用しているNet_Socketクラス内で「fsockopen」「pfsockopen」「stream_socket_client」といった関数が使われているのを確認しました。内部的にやってることは同じなんです。 つまりインストールされているPEARに探りを入れれば送出する内容を見ることが可能です。fwriteされているものをvar_dumpするという感じで。
お礼
詳細な回答ありがとうございます。 すごく助かります。 >「HTTP通信の内容を覗きたいっていったじゃん!」 >「代わりの方法なんて聞いてねーよ!」 全然思ってません^^