メニューボタン
IBMi海外記事2012.11.20

Zend の新しい PHP Toolkit に出会う

Erwin Earley , Alan Seiden 著

i5 Toolkit を XMLService と統合したオープン・ソースのオブジェクト指向アプローチに代える PHP Toolkit

Zend Server バージョン 5.6 のリリースで、PHP を IBM 提供の XMLService と統合するオブジェクト指向のアプローチである、ToolkitService() を組み込んだ新しい PHP Toolkit をサポートして、Zend は、 AURA Equipmentの PHP Toolkit (i5 Toolkit と呼ばれている) から撤退しました。この記事では、新しいツールキットについていくつか例を挙げながら説明し、PHP アプリケーションを IBM i オブジェクト、データ、プログラムと統合する、かつての i5 Toolkit アプローチと比較します。

XMLService の概要

この記事では Zend の ToolkitService クラスを中心にお話ししますが、ToolkitService が活用している IBM i 上の基礎的なサポート、XMLService を理解することも大切です。XMLService は、オープン・ソースの RPG 拡張機能で、IBM i リソース、プログラム、サービス・プログラム、コマンド、PASE ユーティリティー、SQL DB2 の Web XML スクリプティング・コールを可能にします。各種ドライバー・トランスポートが、 DB2/DRDA、ODBC、REST などの XMLService との統合をサポートしており、 単一層 (IBM i) サービスまたは 2 層 (Linux/Windows) サービスとして使用できます。一般的に、XMLService のクライアント、つまりコンシューマーは、PHP、RUBY、Python といった言語、RPG などの IBM i 言語、また単に HTML/XML のスクリプトを作成します。

IBM は、 XMLService を開発、サポートしており、それを Young i Professionals Web サイト (youngiprofessionals.com/wiki/XMLSERVICE) から利用できるようにしました。IBM の XMLService と Zend の新しい PHP ツールキットの強力な組み合わせの目玉は、IBM i へ豊富なインターフェースを提供する IBM と Zend の間のコラボレーションです。

ToolkitService() について

ToolkitService は、XMLService を活用して、上記のような IBM i リソースを消費するオブジェクト指向クラスです。ToolkitService と XMLService との相互作用は、 図 1 に示した複数ステップのプロセスとして表示できます。

図 1: ToolkitService および XMLService の機能フロー

次のように動作します。

  1. ToolkitService はパラメーターと目的の機能を XML に変換し、XML を XMLService に渡します。
  2. XMLService は受け取った XML を解析し、パラメーターを指定して要求された機能を実行します。
  3. XMLService は出力結果を元の XML に変換します。
  4. ToolkitService/PHP は XMLService の XML 出力を解析し、この出力を PHP 配列で返します。

Zend Server のバージョン 5.6 には、XMLService を活用するためのオブジェクト指向 PHP クラスの新しいセットが組み込まれています。サポートは、ToolkitService クラス、iToolkitService クラス、Compatibility Wrapper という広義で 3 種類に分かれています。ToolkitService クラスは、プログラム呼び出しと CL プログラムを扱うためのメソッドとクラス定義を提供しています。iToolkit Service クラスは、ユーザー・スペース、データ・キュー、システム値など他の IBM i オブジェクトを扱うためのメソッドとクラス定義を提供しています。最後に、Compatibility Wrapper を使用すると、 i5_() 呼び出しを備えた既存の PHP アプリケーションは、i5_() 呼び出しを対応する Toolkit/iToolkitService クラス呼び出しに変換することで、引き続き Zend Server 5.6 環境で動作できます。

Zend の累積アップグレード PTF を-5.6 以前の Zend Server バージョンに適用するユーザーは、旧 Easycom/i5 Toolkit のコピーを保持することになり、ツールキットを選べるようになります。新規インストールには、新しいツールキットのみ含まれています。

Zend Server 内での XMLService のサポートは、PHP 言語のオブジェクト指向構造体を使用して実装されているクラスの数に基づいています。昨年度の Erwin の記事 ("Object-Oriented Programming Demystified," 2011 年 3 月号 System iNEWS、記事 ID 65601) を思い出すこととと思います。ここで、オブジェクト指向プログラミングの中心は、実質的に変数 (オブジェクト指向で言う、プロパティー) と関数 (オブジェクト指向で言う、メソッド) のカプセル化を定義するクラス定義です。ツールキットを使用する場合に、オブジェクト指向の知識や経験はそれほど必要ありません。ただし、多少の構文上のニュアンスを理解することは重要で、それについては例を挙げながら説明します。

ToolkitService クラス自体が DB2 設定、また PHP エンジンと XMLService 間の通信を管理します。ToolkitService には、接続、設定、CL コマンド、さらにプログラム呼び出しとパラメーター・インターフェースを操作するメソッド (関数) が組み込まれています。

ツールキットの比較

IBM i のリソース、データ、またはプログラムを使用する PHP プログラムは、まず PHP エンジンと IBM i の間の接続を確立する必要があるため、i5 Toolkit と新しいオープン・ソースのツールキットを比較するには、接続メソッドから始めるのが良いと思います。図 2 と 3 に示した 2 つのコード・スニペットを考えてみましょう。

図 2: i5 Toolkit を使用して PHP と IBM i を接続する
図02

図 3: ToolkitService を使用して PHP と IBM i を接続する
図03

最初に目につく違いは、新しいアプローチでは ToolkitService.php ファイルを使用している点です。このファイルには、クラス定義が入っています。これは、require_once ステートメントで行います。実際は、接続アプローチ自体に違いが見えてきます。新しいツールキットの例では、ToolkitService クラスの getInstance メソッドで接続が確立されています。ここでは、オブジェクト指向の説明が多少整理されています。構文 ToolkitService::getInstance は、ToolkitService クラスの getInstance メソッド (つまり、関数) を呼び出すことを示しています。さらに、getInstance メソッドは 3 つのパラメーターを指定して呼び出し中です。最初のパラメーターは localhost といったホスト名/IP ではなく、 *LOCAL などのデータベース名です。

後で説明しますが、新しいツールキットは、ステートレス環境とステートフル環境の両方をサポートしていることに注目してください。

他にこの例で見られる唯一の違いは、接続を終了させるプロセスです。i5 Toolkit の例では、i5_close() 関数を使用して PHP エンジンと Easycom ジョブ・スレッド間の接続を終了しています。ToolkitService クラスの例では、XMLService ジョブへの接続は $conn オブジェクトから disconnect() メソッドを呼び出して終了しています。繰り返しますが、ここで少しオブジェクト指向の構文について説明する必要があります。 -> 構文は単に disconnect() メソッド (つまり、関数) を $conn オブジェクト (つまり、変数) で表された接続について実行する必要があることを示しています。

図031

CL コマンド SNDMSG を使用してメッセージをユーザーに送信するなど、コードに実際に処理させることで、さらに例を詳しく説明します。

i5 Toolkit を使用する:

ToolkitService を使用する:
図032

ここでの違いは明らかに CL コール自体の性質にあります。i5_() の例では、CL コマンドは、CL コマンドとオプションを単一のパラメーター (ここでは、文字列) として関数へ送信するよう指定する i5_command() 関数から呼び出されます。ToolkitService クラスでは、CL コマンドは、元々 getInstance 関数で作成されたオブジェクトの ClCommand() メソッドから呼び出されます。

ここまでは、i5_() 呼び出しと ToolkitService メソッドの間にはあまり違いは見られず、関数名やメソッド名が違ったり、それらの呼び出しに使用する構文が違ったりしているだけです。IBM i 側で呼び出している関数のパラメーターを定義しなければならない状況を見てみましょう。この例では、ILE でプログラムを呼び出します。

まず、プログラム自体をざっと見てみます。 i5 Toolkit と新しいツールキットの両方の例で、パラメーター定義を参照します。

図033

これは、10 文字の文字列を SOMESTRING、10 進値を SOMENUM で表す 2 つのパラメーターを指定する単純な CL プログラムです。プログラム・ロジックは、指定された文字列の最初の 3 文字だけを返し、指定された 10 進値を 1 ずつ増やしています。図 4 は i5 Toolkit のアプローチでこの CL プログラムを呼び出しているところです。

図 4: i5 Toolkit を使用して CL プログラムを呼び出す
図04

ILE でプログラムを呼び出す場合、i5 Toolkit では、まずプログラムのデータ構造体を定義し、プログラムとデータ構造体へのハンドルを作成する必要があります。この例では、データ構造体自体は、$description 変数で定義されており、この変数は、呼び出されているプログラムで予想されている各パラメーターに配列を持つ 2 次元配列です。データ構造体を定義したら、i5_program_prepare() 関数を使用してプログラムへのハンドルを作成し、入力値を提供するため、また ILE プログラムが結果を配置するための、両方で使用されるデータ構造体を示します。i5_() アプローチの次のステップは、実入力値を定義し、呼び出しからの出力のプレースホルダーを指定することです。この例では、$parmIn 変数が入力値を表し、$parmOut 変数が出力値のプレースホルダーを表します。i5_program_call() 関数により (i5_program_prepare() 呼び出しから返されたハンドルである) $pgm 変数で示されたプログラムが実行されます。$parmIn 配列の値は $description 変数のメモリー・スペースに配置され、$parmOut 変数で示された変数も参照として (そのアドレスなど) $description 配列に配置されます。プログラムが実行されると、PHP プログラムは結果を出力できます。i5 Toolkit 拡張子は、$parmout 配列で SOMESTRING と SOMENUM を参照した結果、変数 $SOMESTRING と $SOMENUM を作成した点に注意してください。

では、同じ CL プログラムを呼び出す場合の、対応する ToolkitService クラスのアプローチを見てみましょう (図5)。

図 5: ToolkitService を使用して CL プログラムを呼び出す
図05

最初の try/catch ブロックは、単純に、ToolkitService オブジェクトの getInstance メソッドを介して、 PHP プログラムと XMLService 間の接続を開始する素晴らしい方法です。try ブロックでは、conn という新しい変数が作成されているのがわかるはずです。この変数は ToolkitService オブジェクト (つまり、クラス) のインスタンスになります。getInstance メソッド (つまり、関数) はパラメーターを指定して、呼び出されています。コードの catch ブロックを使用して、有効な接続が getInstance 呼び出しから返されたことを確認します。

次の 2 行 ($param[] = ...) は、i5 の例の $parmIn ステートメントと $parmOut ステートメントだけでなく、$description 割り当て、i5_program_prepare() に代わるものです。この最初の 2 つのステートメントをもっと詳しく見てみましょう。$param[] 構造は $param が配列であることを示し、索引のない左右の括弧は、値が配列でプッシュされていることを示します。次のパート ($conn->AddParameter...) は、それぞれ文字とパック 10 進パラメーターを作成するために、メソッド AddParameterChar/AddParameterPackDec が呼び出されているところを示しています。この呼び出しの引数は、入力パラメーターに割り当てるデータ方向、パラメーター・サイズ、コメント、パラメーター名、パラメーター値を示しています。両方のデータ方向の値は、パラメーターが入力パラメーターおよび出力パラメーターの両方であることを示しています。

次のステートメント $result = $conn->PgmCall... は、i5 の例の i5_program_call() に代わるものです。PgmCall メソッドのパラメーターは、呼び出されるプログラムの名前 (MYPGMCALL)、プログラムがあるライブラリー (EEARLEY)、プログラムのパラメーター ($param 配列)、プログラムの戻り値 (ここでは、null)、サービス・プログラムの関数名 (これも null) です。PgmCall メソッドで示された ILE プログラムは、$param 配列のパラメーターを指定して呼び出されます。指定されたパラメーターは入力/出力パラメーターであるため、それらに結果が含まれていることが予想されます。最後に、呼び出し自体によりプログラム呼び出しが成功または失敗したか返され、(($result) かどうか) テストできます。

ステートフル対ステートレス

新しいツールキットを使用した呼び出しは、ステートレスまたはステートフルいずれかの環境で実行できます。ステートフル環境は IPC (プロセス間通信) キーを活用して PHP と XMLService ワーカ・ジョブ間の永続的な接続を維持します。

次のステートメントを組み込むことで、次に示す例のようなシンプルなスクリプトをステートレス環境で実行できます。

図051

iToolkitService クラス

プログラムと CL コマンドを呼び出すクラス定義とメソッドを備えた ToolkitService クラスに加えて、Zend Server バージョン 5.6 には iToolkitService クラスが組み込まれています。このクラスには、スプール・ファイル、データ・キュー、ユーザー・スペース、システム値、ジョブ・ログ、オブジェクト・リストを操作するメソッドが組み込まれています。ユーザー・スペースの操作に関する iToolkitService クラスのアプローチの例を短く示して、終わりにします (図 6)。

図 6: iToolkitService でユーザー・スペースを操作する
図06

前述の例のように、まず ToolkitService クラスの getInstance メソッドを呼び出して、XMLService ワーカ・ジョブへの接続を取得します。接続情報は ToolkitService クラスのインスタンスを表す $ToolkitServiceObj 変数に戻されます。(注: コードを簡略化するために、通常は存在するエラー・チェックは省略しました。) 例の 2 行目 ($UserSpace = new UserSpace...) は、UserSpace オブジェクトのインスタンスを表す $UserSpace という新しい変数を作成します。

いくつか変数を設定したら、プログラムの中身に入ります。最初の関数は、以前作成した UserSpace オブジェクトの CreateUserSpace メソッドを通して、ユーザー・スペースを作成しようとします。その関数が成功すると、WriteUserSpace メソッドを使用してテキストをユーザー・スペースに書き込み、ReadUserSpace メソッドを使用してテキストをユーザー・スペースから読み取ります。最後に、DeleteUserSpace メソッドを使用してユーザー・スペースを削除します。

ここで注目すべき最も重要な点は、オブジェクト指向アプローチが単純であることです。ユーザー・スペースを操作するすべてのメソッド/関数は、操作したいデータとともに単一の変数内に含まれています。

新しいオープン・ソース・ツールキットとその主要クラスである ToolkitService は、IBM i 顧客にとり PHP の展望に著しい変化をもたらしています。また、 IBM i の奥底に統合することで、機能が豊富なアプリケーション開発への堅固なアプローチを実現しています。

あわせて読みたい記事

PAGE TOP