コネクト株式会社 技術情報コンテンツ | ||
IBM iのプログラムやコマンドを呼び出すIBM 様のミッドレンジサーバ IBM i上のプログラムやコマンドを呼び出す例です。 注意事項
CL/RPG実行その1パラメータが必要無い場合は、PHPのi5_command 関数と IBM iのCALLコマンドの組み合わせで実行できます。 /** * 接続オプション * ファイルを読み書きするRPGをCLを経由せずに直接使う場合は、初期ライブラリーリストの指定が必要です。 */ $options = array(I5_OPTIONS_INITLIBL => 'YOURLIB'); /** * IBM i に接続します。 * 引数の一番目はIPアドレスです。 * ホスト名文字列も使用できますが、その文字列から IP アドレスが解決できることを確認してください。 * 2番目と3番目はユーザーとパスワードです。 * ユーザープロファイルによるコントロールが不要の場合は、下記の様に記述できます。 */ $i5_con = i5_pconnect('127.0.0.1', '', '', $options); if(!$i5_con){ echo '接続エラー:', i5_errormsg(); exit; } $ret = i5_command('CALL YOURLIB/YOURPGM'); if(!$ret){ echo 'プログラム実行エラー:', i5_errormsg(); }else{ echo 'プログラム実行成功'; } CL/RPG実行その2パラメータが必要な場合は、PHPの i5_program_prepare関数と i5_program_call関数の組み合わせで実行できます。 /** * 接続オプション * パラメータに日本語を使う場合、コードページ変換ファイルの指定が必要です。 * ファイルを読み書きするRPGをCLを経由せずに直接使う場合は、初期ライブラリーリストの指定が必要です。 */ $options = array(I5_OPTIONS_CODEPAGEFILE => '/usr/local/zendsvr/etc/jp_5035.cpg', I5_OPTIONS_INITLIBL => 'YOURLIB'); //IBM i に接続します。 $i5_con = i5_pconnect('127.0.0.1', '', '', $options); if(!$i5_con){ echo '接続エラー:', i5_errormsg(); exit; } /** * パラメータ項目を定義します。 * TXTA 及び TXTB の2項目があり、両方とも文字型50バイトの場合です。 * TXTA は CL/RPG に渡す項目、 TXTB は CL/RPG から受け取る項目とします。 */ $parameters = array( array('Name' => 'TXTA', 'IO' => I5_IN, 'Type' => I5_TYPE_CHAR, 'Length' => 50), array('Name' => 'TXTB', 'IO' => I5_OUT, 'Type' => I5_TYPE_CHAR, 'Length' => 50) ); //TXTA に渡す値を定義します。 $pgm_in = array('TXTA' => '渡したい値')); //TXTB から受け取った値を格納する変数名を定義します。 $pgm_out = array('TXTB' => 'KEKKA'); //プログラム実行リソースを準備します。 $pgm_obj = i5_program_prepare('YOURLIB/YOURPGM', $parameters); if(!$pgm_obj){ echo 'プログラム実行準備エラー:', i5_errormsg(); exit; } //プログラムを実行します。 $ret = i5_program_call($pgm_obj, $pgm_in, $pgm_out); if(!$ret){ echo 'プログラム実行エラー:', i5_errormsg(); }else{ echo 'プログラム実行成功<br>'; //変数名の文字の大小は定義と一致させる必要があります。 echo 'TXTB:', $KEKKA, '<BR>'; } //準備したプログラム実行リソースを閉じます。 i5_program_close($pgm_obj); CL/RPG実行その3その2の発展形です。 /** * CL/RPG 呼び出しクラス。yourpgm.php 内に Yourpgm クラスを作成したと想定します。 */ class Yourpgm { /** * プログラム実行リソース * @var obj */ protected $obj; /** * コンストラクタはインスタンス生成(new)時に呼ばれます。 * この関数名は固定です。 * @param $conn i5_(p)connect によって生成された接続リソース * @throws Exception for i5_errormsg */ public function __construct($conn) { $description = array( array('Name' => 'TXTA', 'IO' => I5_IN, 'Type' => I5_TYPE_CHAR, 'Length' => 50), array('Name' => 'TXTB', 'IO' => I5_OUT, 'Type' => I5_TYPE_CHAR, 'Length' => 50) ); $this->obj = i5_program_prepare('YOURLIB/YOURPGM', $description, $conn); if(!is_resource($this->obj)){ throw new Exception(i5_errormsg()); } } /** * CL/RPG を呼び出します。 * @param string $par1 渡したい値その1(複数の値を一つの配列にまとめて渡すこともできます) * @param string $par2 渡したい値その2(この例では不要ですが、参考のためにダミーとして書きました) * @return array 受け取りたい値の配列(この例では値が一種類だけですが、参考のために配列にしてみました) * @throws Exception for i5_errormsg */ public function call($par1, $par2) { $pgm_in = array('TXTA' => $par1 ); $pgm_out = array('TXTB' => 'KEKKA'); $ret = i5_program_call($this->obj, $pgm_in, $pgm_out); if(!$ret){ throw new Exception(i5_errormsg()); } //連想配列のキーのret1 は任意の名前です。 return array('ret1' => $KEKKA); } /** * インスタンス消滅を待たずに手動で明示的にプログラム実行リソースを閉じたい場合に使います。 * この関数名は任意です。 * @return void */ public function close() { i5_program_close($this->obj); $this->obj = null; } /** * デストラクタはインスタンス消滅時に呼ばれます。 * この関数名は固定です。 * @return void */ public function __destruct() { if(isset($this->obj) && is_resource($this->obj)){ $this->close(); } } } /** * クラスを使う側の処理 */ $options = array(I5_OPTIONS_CODEPAGEFILE => '/usr/local/zendsvr/etc/jp_5035.cpg', I5_OPTIONS_INITLIBL => 'YOURLIB'); $i5_con = i5_pconnect('127.0.0.1', '', '', $options); if(!$i5_con){ echo '接続エラー:', i5_errormsg(); exit; } try { require_once './yourpgm.php'; $pgm = new Yourpgm($i5_con);//コンストラクタが呼ばれます } catch (Exception $e) { echo 'プログラム実行準備エラー:', $e->getMessage(); exit; } try { $ret = $pgm->call('渡したい値その1', '渡したい値その2'); } catch (Exception $e) { echo 'プログラム実行エラー:', $e->getMessage(); $pgm->close(); exit; } echo 'TXTB:', $ret['ret1'] , '<BR>'; $pgm->close(); IBM iのコマンドを実行その1PHP の i5_command関数を使うと、「CL/RPG実行その1」で記載したCALL コマンドだけではなく、その他のIBM iのコマンドも実行できます。 /** * 接続オプション * 取得するテキストに日本語が入っている場合、コードページ変換ファイルの指定が必要です。 */ $options = array(I5_OPTIONS_CODEPAGEFILE => '/usr/local/zendsvr/etc/jp_5035.cpg'); //IBM i に接続します。 $i5_con = i5_pconnect('127.0.0.1', '', '', $options); if(!$i5_con){ echo '接続エラー:', i5_errormsg(); exit; } $cmd_in = array('OBJ' => 'YOURLIB/YOURPF', 'OBJTYPE' => '*FILE'); //TEXT 属性から受け取った値を格納する変数名を定義します。 $cmd_out = array('TEXT' => 'OBJTEXT'); //RTVOBJD OBJ(YOURLIB/YOURPF) OBJTYPE(*FILE) TEXT(&OBJTEXT)相当 $ret = i5_command('RTVOBJD', $cmd_in, $cmd_out); if(!$ret){ echo 'コマンド実行エラー:', i5_errormsg(); }else{ echo 'コマンド実行成功<br>'; //変数名の文字の大小は定義と一致させる必要があります。 echo 'テキスト:', $OBJTEXT, '<BR>'; } IBM iのコマンドを実行その2CHGOBJD (オブジェクト記述変更) コマンドを使って、オブジェクトの TEXT 属性 を変更してみます。
/** * 接続オプション * パラメータに日本語を使う場合、コードページ変換ファイルの指定が必要です。 */ $options = array(I5_OPTIONS_CODEPAGEFILE => '/usr/local/zendsvr/etc/jp_5035.cpg'); //IBM i に接続します。 $i5_con = i5_pconnect('127.0.0.1', '', '', $options); if(!$i5_con){ echo '接続エラー:', i5_errormsg(); exit; } //TEXTパラメータに渡す値は引用符つきです。 $new_text = "'" . 'テキストをこの値に変更します' . "'"; $cmd_in = array('OBJ' => 'YOURLIB/YOURPF', 'OBJTYPE' => '*FILE', 'TEXT' => $new_text); //CHGOBJD OBJ(YOURLIB/YOURPF) OBJTYPE(*FILE) TEXT('ABC')相当 $ret = i5_command('CHGOBJD', $cmd_in, array()); if(!$ret){ echo 'コマンド実行エラー:', i5_errormsg(); }else{ echo 'コマンド実行成功<br>'; } IBM iのコマンドを実行その3データエリアに対する操作など、専用の関数が用意されている場合があります。
/** * 接続オプション * パラメータに日本語を使う場合、コードページ変換ファイルの指定が必要です。 */ $options = array(I5_OPTIONS_CODEPAGEFILE => '/usr/local/zendsvr/etc/jp_5035.cpg'); $i5_con = i5_pconnect('127.0.0.1', '', '', $options); if(!$i5_con){ echo '接続エラー:', i5_errormsg(); exit; } $new_value = 'データエリアをこの値に変更します'; $ret = i5_data_area_write('YOURLIB/YOURDTA', $new_value); if(!$ret){ echo 'Err:', i5_errormsg (); }else{ echo 'OK:'; } |