#freeze
#setlinebreak(on)
* 通信サーバ構築 PEAR :: Net_Server [#iafe2a88]
#htmlinsert(googleAdsense.html)
#ref(http://dozo.rgr.jp/img/img20_file.png,right,nolink,around,PHP::PEAR)

**概要 [#zde8374c]

「このあたりのものをPHPで組むってどおよ?」と思われても困るが。

(ノ・・)ン。。。。。。(((●コロコロッ

プロトコルを自作したことはあるだろうか?
HTTP, SMTP, POP, IMAP, LDAPなどなど、
様々プロトコルが存在して、
皆さんはこれらを(意識的に、無意識的には無関係に)使用しているはず。
では自前でプロトコルを製作したことはあるかな?
 telnet localhost 10000
って言う感じで接続し、
入力した文字を受け取って処理を行うプログラムだ。
なんて言う文字を入力したときに、
なんて言う処理を行い、
なんて言う言葉を返すかというのがいわゆる通信プロトコルだ。

PHPerな方々は「Webでプログラム」っていうのが大前提で、
このあたりのものに関わることはほとんど無いだろう。
逆に仕事で使用する場合では、PHPの様なスクリプト言語では遅くて使い物にならないかもしれない。
(応答速度を測ったことがないのでなんともだが。過去にメルマガ配送エンジンをRubyで実装しているのを見たことがあるので問題ないかもしれないが。)
本来ならばC++などの出番なのだろうが。
それをPHPでやってしまおうというのがこの[[PEAR::Net_Server>http://pear.php.net/package/Net_Server]]。
ちなみにWindowsの出番はない。

デーモンというのをご存じの方も多いと思う。
サーバ上の常駐プログラムのことで、
メモリ上にロードしておき特定のポートにアクセスが来た時にアクションをおこす。
これらの動作はPHPで製作することも可能で、
実行するための関数群が[[socket>http://www.php.net/sockets]]だ。
[[PEAR::Net_Server>http://pear.php.net/package/Net_Server]]はそれらをマスクするクラスだ。

[[socket>http://www.php.net/sockets]]関数を使っての通常のやりとりであるSequentialモジュール。
CLI,CGI版で利用できるマルチプロセス用[[pcntl>http://www.php.net/pcntl]]関数を使用したForkモジュール。
Apache2用のマルチプロセスを使用したMultiprocessモジュールがある。
なかなか本格的だ。
ただし、マルチプロセスに対応させるにはインストールのハードルが結構高い。
なので、今回はSequentialを使用した。
マルチプロセスについては別の機会にしよう。(ってか私も良く理解していない)

**インストール [#e7a1cdfb]
Sequentialモジュールの場合でも、
[[socket>http://www.php.net/sockets]]関数を使用しているため、
PHPのconfigureオプションに
 --enable-sockets
を追加しておく必要がある。
後はPearコマンドでインストールするだけ。
 pear install net_socket

**サンプル [#e1f7655d]
ハンドラを上書きし自身のプロトコルを作成。
そのハンドラを取りまわす形でコードを記述し、
サーバーに常駐させる形でプログラムを始動する。

***handler作成 [#qe78ec5b]
Handlerクラスを継承した自前のクラスを用意しプロトコルを作成する。
 <?
 require_once 'Net/Server.php';
 require_once 'Net/Server/Handler.php';
 
 class myHandler extend Net_Server_Handler{
  
  ・・・各種メソッドをオーバーライド
  
 }
 ?>

各種メソッドについては後述。

***サンプルコード [#r44ef5d4]
プログラムは常駐させるので
 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();
 ?>

***起動 [#ga54e4d2]
 php server.php 
常駐させる時は
 php server.php &

***終了 [#d29272c0]
 kill [プロセス番号]



ちなみに[[PEAR::System_Socket>http://pear.php.net/package/System_Socket]]というのも存在するが、
つくりが複雑な割にできることがイマイチなのと、
メンテナンスがもう行われていないのであまりオススメではない。

#comment



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Third Project
証券会社ランキング比較