SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【php】fsockopen()関数でhttpのGETリクエストを送信する

ソース

<?php
$fp = fsockopen('api.twitter.com', 80);
$out = array(
		'GET /1/statuses/public_timeline.json HTTP/1.1',
		'Host: api.twitter.com',
	);
fwrite($fp, implode($out, "\r\n") . "\r\n\r\n");
ob_start();
fpassthru($fp);
$response = ob_get_clean();
fclose($fp);

$response = explode("\r\n\r\n", $response, 2);
echo 'こっちがヘッダ<pre>' . $response[0] . '</pre>';
echo 'こっちがボディ<pre>' . $response[1] . '</pre>';

解説

1、fsockopen()関数で api.twitter.com に80番ポートで接続します。

2、HTTPのリクエストメッセージを組み立てます。それぞれの行をCR+LFの改行で区切り、メッセージの終わりは改行2つです。

3、fwrite()でリクエスト送信。

4、fpassthru()でレスポンスを回収。fgets()などでfeof($fp)==trueになるまで(EOFまで)読み込んでもよいです。関数ひとつで済ませるのがphpっぽいかなと。

5、最後にレスポンスを確認してみます。ヘッダも含めて取得してしまいますが、CR+LF 2つが区切りなので、そこで分ければよいです。

以上

これだけの処理なら、もちろん file_get_contents('http://api.twitter.com/1/statuses/public_timeline.json') が簡単です。あえてfsockopen()を使った例です。telnetでHTTPをしゃべっているみたいな感じになります。

ちなみにこうするとピンポンダッシュ的な処理になります

file_get_contents()より低レベルな処理ゆえに、こんなことができます。

<?php
$fp = fsockopen('api.twitter.com', 80);
$out = array(
		'GET /1/statuses/public_timeline.json HTTP/1.1',
		'Host: api.twitter.com',
	);
fwrite($fp, implode($out, "\r\n") . "\r\n\r\n");
fclose($fp);

レスポンスを待たずして、リクエストを送ったら即座に撤収します。接続先のサーバーでどれだけ遅い処理をしていても、こちらは接続&切断で即終了です。

結果を待たない場合というのはあまりないと思いますが、何かをキックするだけの場合には使えます。

kの方法で、本当にWebサーバーからのレスポンスを待たずに次の処理に進んでくれるのか確認したい場合は、Webサーバー側に10秒ぐらいsleep()するスクリプトを書いて、そちらにリクエストを送る処理を試してみるとよいです。

関連するメモ

コメント(3)

To_aru_User 2011年12月1日 12:20

遡りコメントすみません;;

この記事に関して、GETだけではなくPOSTについても解説していただけませんでしょうか?
OAuth.phpのsign_requestで何してるかが分かれば…

yoshimura 2011年12月2日 09:22

こちらですね
https://www.softel.co.jp/blogs/tech/archives/2128

OAuth.phpのsign_requestはよくわかりませんけど。

PHPでPOST送信まとめ | プログログ 2015年2月1日 13:19

[…] 【php】fsockopen()関数でhttpのGETリクエストを送信する at softelメモ […]