#norelated
* PRMPの利用について [#j1c4e6e3]
サンプルを使って、プログラミングの方法を解説します。~
~

** プログラミング方法 [#d99f79ee]

1. リモートでなにをするか決める~
2. 「なんかする」部分コーディング~
3. サーバ化~
4. クライアント実装~
5. リモート操作確認~

''1. リモートでなにをするか決める''~
ここでは動作が確認できる簡単なサンプルとして、2つの引数を加算して返す ~
add()~
を作ってみる。~

仕様~
  public int add($param1, $param2)
 
  @param int $param1  加算する第1引数
  @param int $param2  加算する第2引数
  @return int $param1と$param2を加算した結果

''2. 「なんかする」部分コーディング''~
まずは普通のクラスとして実装する。~
クラス名を適当に。ここでは sample_class とする。~
 <?php
 class sample_class {
   public function add($param1, $param2)
   {
     return $param1 + $param2;
   }
 }
 
 // 動作するかどうか確認
 $obj = new sample_class();
 $ret = $obj->add(1, 2);
 print("$ret\n");
 ?>

これを sample_class.php として保存。cliで実行してみる。~
 $ php sample_class.php
 3
これでなんかする部分はOK.これをリモートで呼び出せるようにする。~

''3. サーバ化''~
まずはサーバ側。~
サーバ側はメソッドの引数が必ず配列になるので、それに対応する。~

 public function add($param1, $param2)
 {
   return $param1 + $param2;
 }
            ↓
 public function add($params)
 {
   return $params[0] + $params[1];
 }

これで完了。一応、動作確認。~

 $ret = $obj->add(1, 2);
            ↓
 $ret = $obj->add(array(1, 2));

 $ php sample_class.php
 3

OK.~
このクラス部分のみをsample_class.incというファイル名にして保存し、server_classes.incに登録してサーバ側で利用できるようにする。~
 include_once("sample_class.inc");


''4. クライアント実装''~
クライアント側はclient_stubクラスを継承しなければなりません。~
メソッドの引数/戻り値は「なんかする」部分と同じにします。~

クライアントではコンストラクタが必要になります。~
コンストラクタ内でサーバのURIを指定します。また親クラスのコンストラクタで自身のクラス名の取得などを行うので呼んでおく必要があります。~
初期化init()メソッドを実行すると、サーバとのコネクション確立、リモートメソッドの生成が行われるので、面倒ならばコンストラクタ内部で行ってしまってもよいでしょう。もちろん、クライアントのインスタンスを呼び出す側で行ってもかまいません。~

クライアントのクラスはこのような感じになります。
 <?php
   include_once("client_stub.inc");
 
   class sample_class extends client_stub {
     function __construct()
     {
       $this->setServerURI('tcp://localhost:8000');   // サーバのURIを指定
       parent::__construct();  // 親クラスのコンストラクタを呼ぶ
       $this->init();          // 初期化
     }
 
     public function add($param1, $param2)
     {
       return $this->call_method('add', $param1, $param2);
     }
   }
 ?>

ここではサーバが同じマシンで動いていることを前提としている。~
また、ポート番号は任意であるがサーバと合わせる必要があります。~
(ここではクライアント/サーバとも同一マシンで動作しているので locahostを設定してある。またportが8000なのは気分的に...)~
> $this->setServerURI('tcp://localhost:8000');

実際にサーバと接続している部分は~
> $this->call_method('add', $param1, $param2);
です。~

このメソッドがXML-RPCメッセージを生成しサーバと通信をし、その結果をクライアントプロルラムが利用できる形に変換しています。~
このadd()メソッドからもわかるように、client側のクラスメソッドは単なるstubとして記述されるのがほとんどだと思います。~

''5. リモート操作確認''~
クライアントを実行するためのサンプルスクリプトを用意します。~
リモート機能を後から付け加えたい場合などは、先にこっちのスクリプトに対応するものが存在するでしょう。~

 <?php
   include_once('sample_class.inc');
 
    $obj = new sample_class();
    $res = $obj->add(1, 2);
    print("$res\n");
 ?>

> include_once('sample_class.inc');~
クライアント側のclient_stubからの派生クラスsample_classを読み込んでおきます。~
> $obj = new sample_class();~
そして、インスタンスを生成し~
> $res = $obj->add(1, 2);~
> print("$res\n");~
メソッドを呼んで結果を表示します。~
~

まずはサーバ側を実行。~
 $ php remote_message_server.php

サーバが起動すると~
 > [2008-07-16 10:06:16] 000 "server started" (8695)
のようなログが出力される。(日時と()内部の数字は任意)~

次にテスト用サンプルスクリプトを実行する。~
 $ php client_sample.php
 3
OK!!~

これで一連の実装は完了。~
ここではクライアント側もcliで書いたが、webで書いても同様の動きをする(はず)。~
これで、webサーバマシンとphpのリモートマシンを分離すことができるようになりました。~

さぁ、「なんかおもしろいこと」しましょう♪~

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS