Symfoware

Symfowareについての考察blog

Thrift 0.9.1 PHPでサーバー側の処理を作成する

以前、Thriftのサーバー側の処理をPHPで書いてみました。
Apache + phpの環境でThriftサーバーを動かす

あれから随分仕様が変更されたみたいなので、改めて同じことをやってみたいと思います。



ライブラリの取得



https://thrift.apache.org/
こちらから、「thrift-0.9.1.tar.gz」を取得して解凍します。

解凍したフォルダの「thrift-0.9.1/lib/php/lib」がPHPのライブラリです。
フォルダごとサーバーにコピーしておきます。


テスト用のクライアントはPythonで作成することにしました。
「thrift-0.9.1/lib/py」
これがPythonのライブラリになります。


$ sudo python setup.py install



でインストールしておきます。





thriftコマンド



linux系のOSなら、解凍したフォルダでmake & make install。
Windowsなら、
https://thrift.apache.org/download/
ここから、Thrift compiler for Windows (thrift-0.9.1.exe)をダウンロードして使用します。




使用する定義体



使用する定義体はこんな感じにしました。

・sample.thrift


namespace php Sample.Calc
namespace py sample.calc

service Calculator {
    i32 add(1:i32 num1, 2:i32 num2)
}




「add」というメソッドがあるCalculatorサービスです。





PHP側の処理



まず、サーバーとなるPHPの処理を作成します。
thriftコマンドでPHPのひな形ソースを生成します。


$ thrift -gen php:server sample.thrift



「gen-php」というフォルダが出力されるので、
フォルダごとサーバーにコピーします。

webサーバー側のフォルダ構成はこうなりました。

335_01.png


「gen-php」がthriftコマンドで生成したフォルダ。
「lib」がthrift-0.9.1.tar.gzを解凍した中から取り出したフォルダ。

index.phpが作成するプログラムになります。
内容はこんな感じになりました。


  1. <?php
  2. // --- Thriftライブラリのロード
  3. require_once __DIR__.'/lib/Thrift/ClassLoader/ThriftClassLoader.php';
  4. use Thrift\ClassLoader\ThriftClassLoader;
  5. $loader = new ThriftClassLoader();
  6. $loader->registerNamespace('Thrift', __DIR__ . '/lib');
  7. // registerDefinitionの第一引数はネームスペース
  8. $loader->registerDefinition('Sample', __DIR__ . '/gen-php');
  9. $loader->register();
  10. // Thriftのライブラリを指定
  11. use Thrift\Protocol\TBinaryProtocol;
  12. use Thrift\Transport\TBufferedTransport;
  13. use Thrift\Transport\TPhpStream;
  14. // thriftコマンドで生成したひな形を指定
  15. use Sample\Calc\CalculatorIf;
  16. use Sample\Calc\CalculatorProcessor;
  17. // addの実体
  18. class CalculatorHandler implements CalculatorIf {
  19. public function add($num1, $num2) {
  20.     return $num1 + $num2;
  21. }
  22. };
  23. // これ以降はお決まりの処理
  24. header('Content-Type', 'application/x-thrift');
  25. $handler = new CalculatorHandler();
  26. $processor = new CalculatorProcessor($handler);
  27. $transport = new TBufferedTransport(new TPhpStream(TPhpStream::MODE_R | TPhpStream::MODE_W));
  28. $protocol = new TBinaryProtocol($transport, true, true);
  29. $transport->open();
  30. $processor->process($protocol, $protocol);
  31. $transport->close();






Python側の処理



クライアントはPythonで作成します。
thrift定義体から雛形ソースを生成します。


$ thrift -gen py:utf8strings sample.thrift



「gen-py」というフォルダが生成されますので、これを使用して
プログラムを作成します。

フォルダの構成はこうなりました。

335_02.png


「gen-py」がthriftコマンドで生成したひな形。
「test.py」がこれから作成するプログラム本体です。

内容はこんな感じになりました。


  1. # -*- coding:utf-8 -*-
  2. import sys
  3. # thriftコマンドで生成した雛形を取り込み
  4. sys.path.append('gen-py')
  5. #thriftファイルに記載したネームスペース
  6. from sample.calc import Calculator
  7. #お決まりのimport
  8. from thrift.protocol import TBinaryProtocol
  9. from thrift.transport import THttpClient
  10. try:
  11.     #サーバーのURLを指定
  12.     transport = THttpClient.THttpClient("http://192.168.1.101/calc/index.php")
  13.     protocol = TBinaryProtocol.TBinaryProtocol(transport)
  14.     
  15.     client = Calculator.Client(protocol)
  16.     transport.open()
  17.     
  18.     #指定したaddメソッドを呼び出す
  19.     sum = client.add(10,21)
  20.     #計算結果を表示
  21.     print '[client print] 10+21=%d' % (sum)
  22.     
  23.     #後始末
  24.     transport.close()
  25. except Thrift.TException, tx:
  26.     print '%s' % (tx.message)




pythonのクライアントを実行してみます。
ちゃんと処理結果が帰って来ました。


$ python test.py
[client print] 10+21=31

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/02/28(金) 00:11:03|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ