「このあたりのものをPHPで組むってどおよ?」と思われても困るが。
(ノ・・)ン。。。。。。(((●コロコロッ
プロトコルを自作したことはあるだろうか?
HTTP, SMTP, POP, IMAP, LDAPなどなど、
様々プロトコルが存在して、
皆さんはこれらを(意識的に、無意識的には無関係に)使用しているはず。
では自前でプロトコルを製作したことはあるかな?
telnet localhost 10000
って言う感じで接続し、
入力した文字を受け取って処理を行うプログラムだ。
なんて言う文字を入力したときに、
なんて言う処理を行い、
なんて言う言葉を返すかというのがいわゆる通信プロトコルだ。
PHPerな方々は「Webでプログラム」っていうのが大前提で、
このあたりのものに関わることはほとんど無いだろう。
逆に仕事で使用する場合では、PHPの様なスクリプト言語では遅くて使い物にならないかもしれない。
(応答速度を測ったことがないのでなんともだが。過去にメルマガ配送エンジンをRubyで実装しているのを見たことがあるので問題ないかもしれないが。)
本来ならばC++などの出番なのだろうが。
それをPHPでやってしまおうというのがこのPEAR::Net_Server。
ちなみにWindowsの出番はない。
デーモンというのをご存じの方も多いと思う。
サーバ上の常駐プログラムのことで、
メモリ上にロードしておき特定のポートにアクセスが来た時にアクションをおこす。
これらの動作はPHPで製作することも可能で、
実行するための関数群がsocketだ。
PEAR::Net_Serverはそれらをマスクするクラスだ。
socket関数を使っての通常のやりとりであるSequentialモジュール。
CLI,CGI版で利用できるマルチプロセス用pcntl関数を使用したForkモジュール。
Apache2用のマルチプロセスを使用したMultiprocessモジュールがある。
なかなか本格的だ。
ただし、マルチプロセスに対応させるにはインストールのハードルが結構高い。
なので、今回はSequentialを使用した。
マルチプロセスについては別の機会にしよう。(ってか私も良く理解していない)
Sequentialモジュールの場合でも、
socket関数を使用しているため、
PHPのconfigureオプションに
--enable-sockets
を追加しておく必要がある。
後はPearコマンドでインストールするだけ。
pear install net_socket
ハンドラを上書きし自身のプロトコルを作成。
そのハンドラを取りまわす形でコードを記述し、
サーバーに常駐させる形でプログラムを始動する。
Handlerクラスを継承した自前のクラスを用意しプロトコルを作成する。
<? require_once 'Net/Server.php'; require_once 'Net/Server/Handler.php'; class myHandler extend Net_Server_Handler{ ・・・各種メソッドをオーバーライド } ?>
各種メソッドについては後述。
プログラムは常駐させるので
server.php <? // ポート9090、localhost $server = &Net_Server::create('sequential', 'localhost', 9090); // タイムアウト時間を設定 $server->setIdleTimeout(10); // if (PEAR::isError($server)) { echo $server->getMessage()."\n"; } // ハンドラのインスタンスを生成 $handler = &new myHandler(); // サーバにハンドラをセット $server->setCallbackObject($handler); $server->readBufferSize = 1; $server->readEndCharacter = "\n"; // $server->_debug = true; // 起動 $server->start(); ?>
php server.php
常駐させる時は
php server.php &
kill [プロセス番号]
ちなみにPEAR::System_Socketというのも存在するが、
つくりが複雑な割にできることがイマイチなのと、
メンテナンスがもう行われていないのであまりオススメではない。