第7回 Net_Socket クラス - ソケット通信用ライブラリ - PEAR講座
くまっち先生のPEAR講座
Lecutures on PHP
第7回 Net_Socket クラス - ソケット通信用ライブラリ (その1)
PHPはサーバ用途だけではありません
普段私たちがPHPを利用するシーンといえば、主にWebサイトのプログラム言語として利用するというものではないでしょうか。
Webサイトというものは、ユーザからの情報参照の要求(リクエスト)に対して応答(レスポンス)を行うというやり取りにより成り立っています。ここでいう要求を行うユーザを一般的に「クライアント」といい、一方応答を行う側を「サーバ」といいます。そしてこれらのやり取りによって成り立つシステムのモデルを「クライアントサーバモデル」といいます。 つまりここでのPHPはサーバ用途による利用ということになります。
また皆さんは手持ちのPCで、HTTPを利用してWebの閲覧を行うためのブラウザ、あるいはFTPを利用するためのFTPソフト、Telnet接続をするためのターミナルソフトといったものを利用したことがあるかと思いますが、これらが全て要求を行うクライアントになります。
PHPはサーバ用途による利用だけではなく、要求側であるクライアントとしての利用を行うための機能も予め準備されており、簡単なプログラムコードを書くことですぐに実現することができます。むしろ「サーバ」として外部のソフトウェア(例えばWebサーバのApacheなど)を準備しなくてよい分、クライアント利用の方がお手軽かもしれません。
クライアント利用を行うためには、ネットワーク関数 (*1)、およびリソースから情報を入出力するためのファイルシステム関数 (*2)を使用することで、指定するサーバに対して接続や要求を行うことになります。
例えば、WebブラウザのようにHTTPを利用してWebサーバへ要求するよう通信を行う場合、リスト1のようなコートを記述します。
リスト1. HTTPによる通信例
$host = 'www.phppro.jp';
$port = 80;
$fp = fsockopen($host, $port);
fwrite($fp, "GET http://$host/ HTTP/1.1\r\n");
fwrite($fp, "Host: $host\r\n");
fwrite($fp, "\r\n");
while (!feof($fp)) {
print fgets($fp, 1024);
}
fclose($fp);
本来ならば、正しくサーバに接続できたかどうかを確認する処理も行わなければなりませんが、リスト1のコードではそれらを省略しています。ここでは、以下のような一連の処理を行っています。
1. fsockopen関数を利用してサーバとの接続 2. fwrite関数による要求内容の送信 3. fgets関数で応答内容を取得
なおサーバとの接続後に送信している「GET~」「Host:~」といった要求内容は、第2回~第5回のPEAR講座でも取り上げていたRFCにより規定されているルールに沿ったものです。第2回~第5回の講座では、要求に対する応答内容を送信する処理のお話でしたが、今回は要求する側のお話。つまり今回の講座は前講座までと立場が逆転しているシチュエーションというわけです。
Net_Socketを利用した通信処理
Net_Socketは、クライアント通信処理を行うためのパッケージです。パッケージ内部のコードでは前述したネットワーク関数を利用しており、ユーザはこのパッケージを利用することで、オブジェクト指向的にネットワーク通信処理を実現することができるようになります。
先ほどのリスト1のコードをこのNet_Socketを利用して記述すると、次のリスト2のようになります。元が簡単なコードですので極端なコードの違いはありませんが、接続・要求・応答内容に伴う取得処理がより明確なコードとして書くことができるようになります。
リスト2. HTTP通信にNet_Socketを使用した例
require_once 'Net/Socket.php';
$host = 'www.phppro.jp';
$port = 80;
$sock = new Net_Socket();
$sock->connect($host, $port);
$sock->writeLine("GET http://$host/ HTTP/1.1");
$sock->writeLine("Host: $host");
$sock->writeLine("");
while (!$sock->eof()) {
print $sock->read(1024);
}
$sock->disconnect();
----
*1) http://www.php.net/manual/ja/ref.network.php
*2) http://www.php.net/manual/ja/ref.filesystem.php




ページのトップへ


今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!