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


Old/Zend Server/IBMi

Zend Server for IBM i:: プログラム開発に関する FAQ

  • この情報の対象は、Zend Server for IBMi の下記のバージョンです。
    • Ver 5.0.1 日本語版
    • Ver 5.1.0 日本語版
  • 下記のバージョンは対象外です
    • Ver 5.1.1 以降のすべて
    • Ver 5.1.0 以前の 英語版 のすべて

いくつかの文字が化けてしまいます

たとえば下記の原因が考えられます。

  1. CCSID 1399 のみで扱える文字を CCSID 5035 環境で扱った場合
    • たとえば丸数字やローマ数字は CCSID 5035 では取り扱いできません。
      扱う必要がある場合、CCSID 1399 環境にする必要があります。
  2. EASYCOM のコードページ変換ファイルでは対応していない場合
    • DB2 関数では取得できても、i5 関数では扱えない文字(記号)があります。
      たとえば、下記がその例です。
      1. EBCDIC CODE:E9F3(マイナス記号に似ています)
      2. EBCDIC CODE:E9F4(波線です)
      3. EBCDIC CODE:E9F5(縦の棒で中央が欠けています)
    • DB2 関数では取得できても、i5 関数では別の文字に変わる文字(記号)があります。
      旧JISと新JISとの間で文字コードが入れ替えられた影響です。
      V5R4 で確認する限りでは、IBMi の EBCDIC と Shift-JIS との対応は1983年制定の JIS 規格(旧JIS)に基づきます。
      しかし、コードページ変換ファイルは、1990年制定の JIS 規格(新JIS)に準拠しています。
      下記に、文字コード入れ替えの影響を受ける文字の組を列挙します。
      鯵⇔鰺、砿⇔礦、迩⇔邇、鴬⇔鶯
      蕊⇔蘂、蝿⇔蠅、蛎⇔蠣、靭⇔靱
      桧⇔檜、撹⇔攪、賎⇔賤、侭⇔儘
      竃⇔竈、壷⇔壺、薮⇔藪、潅⇔灌
      砺⇔礪、篭⇔籠、諌⇔諫、梼⇔檮
      頚⇔頸、涛⇔濤
  3. CCSID 5026 のデータを CCSID 5035(1399)で扱った
    • 5026 と 5035 との間では、半角カナと英語小文字の領域が入れ替わっています。

J型項目をdb2_prepare や i5_prepareで使用できますか

残念ながらJ型項目に対するパラメーターマーカー(?記号)が使用できません。
J型項目に対しては、パラメーターマーカーを使わない方法でのSQL実行をお勧めします。

実行時間の上限を増やしたい場合、どうしたらいいですか

ini_set 関数で max_execution_time 値を指定するか、または set_time_limit 関数を使用します。
php.ini の max_execution_time を大きな値に変更すると全ての PHP スクリプトに対して有効になりますが、
意図しない無限ループを含む PHP スクリプトの実行を短時間で停止できなくなります。
長時間かかる処理を含む PHP スクリプトに対して個別に設定するほうが安全です。

パフォーマンスを向上させたい

Zend Studio for IBM iのプロファイラ機能やZend Server for IBM iのコードトレーシング機能を利用して長時間かかる処理を調査可能です。

例)ネットワークの問題

IP アドレスの替わりにホスト名を使用している場合、そのホスト名から IP アドレスを正しく得られることを確認してください。
例えば i5_connect の第一引数に localhost を使用する場合、
CFGTCP>TCP/IP インターフェースの処理 にて localhost と 127.0.0.1 の対応が登録されている必要があります。

その他

その他のパフォーマンス・チューニングについて、詳しくはお問い合わせください。

PHPから呼び出したRPGをデバッグするにはどうしたらいいですか

RPG側で何らかの工夫が必要かと推測されます。
例えば、RPGを2つの部分に分割します。

  1. PHPから渡した値を受け取ってDBに格納し、ダミーの返り値を返すだけのRPG
  2. DBに格納された値を元に処理する本体部分のRPG

PHPから1番目のRPGを呼び出しておいて、後で2番目のRPGを5250画面でデバッグします。
なお、意図的にRPGやCL内でプログラム実行を中断させるとWRKACTJOB画面では、
ZENDSVRサブシステム配下にてPHPJOBジョブがメッセージ待ち(MSGW)状態で表示されます。
オプション欄に5を入力することによりジョブログなどをご確認いただけます。

非常に長い項目を取得できません。

6000バイト位などの長い項目の場合、データが取得できないことがあります。

php.ini 上で ibm_db2.i5_dbcs_alloc を 1 に設定すると、ibm_db2 エクステンション内で元の長さを6倍することによる影響と考えられます。

UTF-8 では1文字当たり最大6バイト使うことがありえたため、EBCDICとの文字コード変換の際に十分な長さを確保しようとしてこの動作を行わせていると推測されます。その結果、DB2 での項目最大長の6分の1の長さを超えると異常が発生すると考えられます。

なお、ibm_db2.i5_dbcs_alloc を 1 に設定して既に使用中の場合、 0 に変えると、既存のプログラムで EBCDICとUTF-8との文字コード変換に支障をきたす可能性があります。

SQLで取得した結果の表示が途中で切れてしまいます。

DBCS、もしくは半角カナを格納した項目の場合、UTF-8では日本語の文字は3バイト以上の長さで表現されるため、UTF-8に変換した結果が元々の項目の長さを超える場合があります。

echo命令で表示すると、途中から切り捨てられ(場合によっては@記号が最後について)いるように見えます。
UTF-8に変換した結果が余裕を持って収まる長さの結果を返すように見せかけるSQLを記述することで対処可能です。

QCCSID が65535または5026の場合、5035(または1399)状態と認識させることにより改善する可能性があります。
まず下記をお試しください
/www/zendsvr/conf/httpd.conf に下記の記述を追加します。
DefaultFsCCSID 5035
DefaultNetCCSID 943
CGIJobCCSID 5035


たとえば、20バイトの項目KANAMEが半角カナ文字で埋め尽くされると、UTF-8の変換結果は最大60バイトになります。
そこで、最初から60バイトの長さの結果を返すことが有り得るようにSQLを記述します。

SELECT RTRIM(CAST( KANAME AS CHAR(60) )) AS KANAME FROM JINMEI

同様に、20バイトの項目KANJMEが漢字で埋め尽くされると、UTF-8の変換結果は27バイト以上になる可能性があります。

(20-2)/2*3 = 27

そこで、最初から27バイト以上の長さの結果を返すことが有り得るようにSQLを記述します。

SELECT RTRIM(CAST( KANJME AS CHAR(30) )) AS KANJME FROM JINMEI

ROLLBACKやCOMMITを使用するには、どのようにすればよいですか。

  1. 前提条件として、対象のオブジェクトに対してあらかじめジャーナル処理を設定しておかなければいけません。
    • ライブラリを SQL の CREATE COLLECTION で作成し、物理ファイルも CREATE TABLE で作成すると、
      デフォルトでジャーナル処理されます。
    • 物理ファイルにジャーナル処理を設定せずに、論理ファイルを SQL の CREATE VIEW で作成しても無意味です。
  2. db2_(p)connectの第4番目の引数に自動コミット無効を指定。
    array('autocommit' => DB2_AUTOCOMMIT_OFF)
  3. さらに下記のいずれかを行います。
    • php.ini にコミット許可を指定。
      ibm_db2.i5_allow_commit = 1
    • db2_(p)connectの第4番目の引数の連想配列に分離レベルも指定。
      array('autocommit' => DB2_AUTOCOMMIT_OFF,
            'i5_commit' => DB2_I5_TXN_xxxx)
      xxxxは例えばREAD_COMMITTED
    • db2_(p)connectで接続後、SQLで分離レベルを指定。
      SET TRANSACTION ISOLATION LEVEL xxxx
      xxxxは例えばREAD COMMITTED
  4. 任意のSQLを実行後、db2_rollback または db2_commit を使用します。

.htaccess で php_value を使いたい

Apache との連携が mod_php ではなく FastCGI 実装のため、
php_value などのディレクティブを IfModule mod_php5.c という条件文で囲む必要があります。

PHPのtimeメソッドが取得する時刻はどのような時刻ですか。

timeメソッドは、QTIMEを取得するAIXのコマンドを内部で実行しています。


最終更新のRSS