まず、Net_Serverを使用するためには、PHPのsocket関数モジュールが必要です。このモジュールはPHPに標準で付属しているので、コンパイルの際に

--enable-sockets

とつけてコンパイルするか、Windows版を使用している場合は

;extension=php_sockets.dll

とある行のコメントアウトを外して下さい。次に、

pear install Net_Server

としてNet_Serverをインストールします。実際のスクリプトは、以下のようになります。

<?php
require_once "Net/Server.php";
require_once 
"Net/Server/Handler.php";

class 
Net_Server_Handler_Sample extends Net_Server_Handler
{
  var 
$user_name = array();
  var 
$is_connect_start = array();

  function 
onConnect($client_id 0)
  {
    
$this->is_connect_start[$client_id] = true;
    
$this->_server->sendData($client_id"enter your name: ");
  }

  function 
onReceiveData($client_id 0$data "")
  {
    if (
$this->is_connect_start[$client_id]) {
      
$this->is_connect_start[$client_id] = false;
      
$this->user_name[$client_id] = trim($data);
      
$this->_server->sendData($client_id"\n Welcome " . $this->user_name[$client_id] . "\n");
      return;
    }

    switch (
trim($data)) {
      case 
"":
        break;
      case 
"\quit":
        
$this->_server->closeConnection($client_id);
        break;
      default:
        
$this->_server->broadcastData($this->user_name[$client_id] . " : " .$data);
        break;
    }
  }
}

$server = &Net_Server::create("sequential""192.168.10.2"10000);

if (
PEAR::isError($server)) {
  echo 
$server->getMessage() . "\n";
}

$handler = &new Net_Server_Handler_Sample;

$server->setCallbackObject($handler);
$server->_debug true;

$server->start();

?>

このスクリプトにmyServer.phpという名前をつけて保存し、コマンドラインから

php myServer.php

を実行します。すると、サーバプログラムが常駐するので、telnetなどで192.168.10.2のポート10000へアクセスしてみましょう。一番最初に名前を聞かれ、その後適当に入力を繰り返すと、入力した内容が発言としてレスポンスされるのがわかると思います。「\quit」というコマンドで接続を終了することもできます。また、別のtelnet端末からアクセスすることで、簡易チャットのようなやり取りが可能です。

基本的な作成方法としては

  1. Net_Server::createメソッドの引数にそれぞれサーバのタイプ(sequentail ,fork)、サーバ名、接続ポート番号を指定して、サーバインスタンスを生成。
  2. ハンドラを作成し、setCallbackObjectメソッドでサーバインスタンスのコールバックオブジェクトに設定。
  3. start()メソッドでサーバを開始

という流れになります。ハンドラの各メソッドをオーバーロードすることで、様々な応答処理を行うことが出来ます。ここでは簡単な実装しか行いませんでしたが、ここまで出来るだけでも、後は工夫次第で様々な機能を持たせることも容易に可能であることがわかると思います。

PEAR::Net_Serverは、普段開発をしているだけでは、ほとんどお世話になる事のないライブラリかもしれません。しかし、ちょっと面白いことをしよう、と考えた時には意外とやれることの幅を広げてくれるのではないでしょうか。

PEAR::Net_Server : http://pear.php.net/manual/ja/package.networking.net-server.php



(アシアル 亀本大地)


この記事は、アシアルが運営するPHP開発者のためのポータル&コミュニティサイト「PHPプロ!」で毎週配信しているPHP・TIPSメーリングリストを再録したものです。
同サイトでは、他にもPHP最新ニュースや、困ったときのQ&A掲示板、初心者向けのPHP講座など、PHP開発者をサポートする情報を掲載しています。