konekto Inc with PHP , MySQL コネクト株式会社 技術情報コンテンツ


Old/Zend Core for i5OS

IBM iのプログラムやコマンドを呼び出す

IBM 様のミッドレンジサーバ IBM i上のプログラムやコマンドを呼び出す例です。
なお、IBMi 関連の Zend 製品については、弊社に直接お問い合わせいただいてもサポートいたしかねますので、
ご理解いただけますようよろしくお願いいたします。

注意事項

  • i5/OS, System iもしくはAS/400をご利用のかた
    • IBM iという語句を適宜お読み替え下さい。
  • Zend Core for i5/OSをご利用のかた
    1. 適用範囲は、Ver 2.0 の日本語版です。 他の Ver、および英語版は対象外です。
    2. /usr/local/zendsvr/etc というパスを /usr/local/Zend/Core/etc にお読み替え下さい。
    3. i5_pconnect関数が使えません。その代わりに i5_connect関数を使用し、
      各 exitの直前やプログラムの終了前に i5_close関数を記述してください。
  • Zend Server for IBM iをご利用のかた
    • この情報の対象は、Zend Server for IBMi の下記のバージョンです。
      • Ver 5.0.1 日本語版
      • Ver 5.1.0 日本語版
    • 下記のバージョンは対象外です
      • Ver 5.1.1 以降のすべて
      • Ver 5.1.0 以前の 英語版 のすべて
  • コードページ変換ファイル
    • 日本語版にのみ付属します。

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 呼び出しクラスを作成し、i5_program で始まる関数を全て呼び出しクラスの中にまとめます。

/**
 * 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のコマンドを実行その1

PHP の i5_command関数を使うと、「CL/RPG実行その1」で記載したCALL コマンドだけではなく、その他のIBM iのコマンドも実行できます。
RTVOBJD (オブジェクト記述検索) コマンドを使って、オブジェクトの 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;
}
 
$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のコマンドを実行その2

CHGOBJD (オブジェクト記述変更) コマンドを使って、オブジェクトの TEXT 属性 を変更してみます。

  • 注意:オブジェクトの属性が変更されますので、ご自分で作成して管理されているオブジェクトでのみ実行してください。
  • コマンド成功と表示されたら、DSPOBJD (オブジェクト記述表示) や STRPDM (PDM開始) コマンドなどを利用してオブジェクトの属性を表示させると、テキスト項目が「テキストをこの値に変更します」に変化しているはずです。
/**
 * 接続オプション
 * パラメータに日本語を使う場合、コードページ変換ファイルの指定が必要です。
 */
$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

データエリアに対する操作など、専用の関数が用意されている場合があります。

  • CHGDTAARA に相当する関数の例です。
/**
 * 接続オプション
 * パラメータに日本語を使う場合、コードページ変換ファイルの指定が必要です。
 */
$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:';
}

最終更新のRSS