Hatena::ブログ(Diary)

ushidayの日記 RSSフィード

2015-10-21

ZendServer8.5 for IBM i(PHP5.6)を入れて・・・

| 19:19

iSUC福岡大会に参加して、モチベーションが上向いているうちに、「よーしZendServer8.5のPHP5.6に更新しよう!」と意気込んでいたら、PHP5.6からCA証明書のチェックが必須となったみたいで、SSL/TLSメール送信でコケてました。

以下の様な事が書いてありました。

「5.6.0 … peer_fingerprint と verify_peer_name が追加されました。 verify_peer のデフォルトが TRUE に変わりました。」

◆参考リンク

ソケット接続実行時エラーログ
exception 'Zend_Mail_Protocol_Exception' with message 'Could not open socket' in .../library/Zend/Mail/Protocol/Abstract.php:277
Stack trace:
#0 .../library/Zend/Mail/Protocol/Smtp.php(167): Zend_Mail_Protocol_Abstract->_connect('ssl://hogehoge.co.jp:xxx')
#1 .../library/Zend/Mail/Transport/Smtp.php(199): Zend_Mail_Protocol_Smtp->connect()
#2 .../library/Zend/Mail/Transport/Abstract.php(348): Zend_Mail_Transport_Smtp->_sendMail()
#3 .../library/Zend/Mail.php(1194): Zend_Mail_Transport_Abstract->send(Object(Zend_Mail))
#4 .../library/org/cscweb/util/mail/myMail.php(324): Zend_Mail->send(Object(Zend_Mail_Transport_Smtp))
#5 .../application/controllers/OrderController.php(408): myMail->send()
#6 .../library/Zend/Controller/Action.php(516): OrderController->mailshippinglistAction()
#7 .../library/Zend/Controller/Dispatcher/Standard.php(308): Zend_Controller_Action->dispatch('mailshippinglis...')
#8 .../library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#9 .../library/Zend/Application/Bootstrap/Bootstrap.php(105): Zend_Controller_Front->dispatch()
#10 .../library/Zend/Application.php(384): Zend_Application_Bootstrap_Bootstrap->run()
#11 .../public/index.php(110): Zend_Application->run()
#12 {main}

以下のソースをPHP5.6単体で実行したら

<?php

$fp = stream_socket_client("ssl://www.google.co.jp:443/", $errno, $errstr, 30);

if ($fp === false) {
    echo 'NG' ;
    throw new Exception($errstr);
} else {
    fclose($fp);
    echo 'OK' ;
}

こんなエラー

Warning: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in .../test.php on line 3
Warning: stream_socket_client(): Failed to enable crypto in .../test.php on line 3
Warning: stream_socket_client(): unable to connect to ssl://www.google.co.jp:443/ (Unknown error) in .../test.php on line 3

そんな訳で「php.ini」に、以下を設定

[OpenSSL]
openssl.cafile = /QOpenSys/QIBM/UserData/SC1/OpenSSL/certs/cacert.crt
;openssl.capath = ""

ZENDSVR6のApacehインスタンス再起動でOKでした。めでたしめでたし。

2011-09-28

Zend Server CE 5.0 for IBM iのdb2_bind_paramで

| 14:01

Zend Server CE 5.0 for IBM i(PHP 5.3 Ver)で、最初からインスコされているIBM_DB2のPECLはバージョン”1.8.4”です。このバージョン”1.8.4”のPECLは、既知のバグがあり、関数、クラス内で「db2_prepare → db2_bind_param → db2_execute」をすると、db2_bind_param関数で割り当てる、変数のスコープがどうもおかしいようで、以下のようなエラーになります。

Warning: db2_execute() [function.db2-execute]: Value Not Bound in hoge.php on line XX
Warning: db2_execute() [function.db2-execute]: Binding Error 3 in 

PECLのサポートサイトより

最新のPECLでは、この既知の問題は解決しているようなので、IBM iのZend Server CEに、2011.09.28現在最新の”1.9.2”を導入しました。

いったんは、IBM i上でビルドを試みましたが、「ibm_db2.so」は出来上がるものの、ファイルのバイト数が明らかに小さく、起動時にエクステンションエラーになってしまいました。結果的にはAIX上でビルドしたエクステンションは、正常通り動作しました。「db2_prepare → db2_bind_param → db2_execute」も問題なく使えます。

もし、バイナリが欲しい方がいたら、このブログにコメント下さい。1.9.2の”ibm_db2.so”を提供します。但し、使用は自己責任で。

ビルドの際に、宣言エラーが抜けている様なので、以下の箇所を追加しました。


-- エラー1
../ibm_db2-1.9.2/ibm_db2.c: In function '_php_db2_connect_helper':
../ibm_db2.c:2109: error: 'conn_handle' has no member named 'c_i5_allow_commit'

-- 対応:「ibm_db2.c」に宣言を追加
   114 long c_i5_allow_commit;

-- エラー2
../ibm_db2-1.9.2/ibm_db2.c: In function '_ibm_db_chaining_flag':
../ibm_db2-1.9.2/ibm_db2.c:6761: error: 'SQL_ATTR_CHAINING_BEGIN' undeclared (first use in this function)

-- 対応:「php_ibm_db2.h」に定数を追加
    302 #ifdef PASE /* i5/OS ease of use turn off/on */
    303     #ifndef SQL_ATTR_CHAINING_BEGIN-
    304         #define SQL_ATTR_CHAINING_BEGIN 2464
    305         #define SQL_ATTR_CHAINING_END 2465
    306         #define SQL_IS_POINTER -4
    307     #endif-
    308 #endif /* PASE */

PECL 1.9.2の確認

f:id:ushiday:20110928122751p:image

とりあえず、この情報が役立つか判らないけど、PECLのサポートに上げておいた。

http://pecl.php.net/bugs/bug.php?id=24382

2011-09-25

FirePHP(Webug)でハマタ。

| 16:00

DBの設定ファイルを「fwrite関数」を使って書き換える、プログラムを実行するとオカシナ動きをした。

hoge.ini」を以下の様にしたかった

  • 実行前の「hoge.ini」
;現在無効な設定1
;現在無効な設定2
現在有効な設定1
  • 実行後の「hoge.ini」
現在無効な設定1
;現在無効な設定2
;現在有効な設定1

でも、こうなっちゃう

;現在無効な設定1
;現在無効な設定2
;現在有効な設定1

処理は、Zend Frameworkを使っているのだけど、アクションコントローラ(Action Controller)のアクションメソッド(Action Method)で「$_SERVER変数」をダンプすると、2回ログが吐き出されている事が分かった。

しかも、2回目のリクエストのHTTPヘッダーには、'HTTP_X_FIREPHP'とか入っている。

原因はコレだ。Chrome Extensionの「Webug(FirePHP)」。恐らくFirefoxのFirePHPも同じだと思う。

Extensionをオフしたら、すんなりOKだった。

DBの追加、更新処理とか2回走ったら、ヤバイねこれ。怖っ!

使わない時は切っておこ。

2011-09-19

DB2 for i copy to DB2 LUW

| 19:18

DB2 for iからDB2 LUWへデータコピーをしたかったので、phpで作った。

処理自体は、簡単なものでスキーマ名とテーブル名をのfrom toを受け取って、DELETE and INSERTするだけ。

CREATE TABLEは既にされているという前提で...

<?php

//Db2 for i
$db2I = Zend_Db::factory($conf);

//SQL
$select = $db2I->select()
              ->from($schema . '.' . $table);
$stmt = $db2I->query($select) ;
$fromRows = $stmt->fetchAll();

//DB2 LUW

$db2LUW = Zend_Db::factory($conf2);

//削除
$count = $db2LUW->delete($schema . '.' . $table);

//追加
foreach ($fromRows as $row ) {
    $db2LUW->insert($schema . '.' . $table, $row);
}

?>

これを、Windows版 Zend Serverで動かすと、DB2 LUWにデータは書かれるのだけど、Zend Server for i上で動かすと、LUW側のコネクションも、IPアドレスやポートは、無視されて、自己参照してしまう。

今回のケースは、たまたまiもLUWもデータベース名、ユーザ、パスワード全てが、両方で同じだったので、自己参照をしたという結果になった。

DB2のドライバが違うんだろうね。確かに接続パラメータも違うしね。

と言うことは、「iの方でDRDA使えば更新出来んじゃね?」と言うことは容易に想像がつくのだが...「'分散データベースの接続の試みで認可が正常に実行されません。 SQLCODE=-30082」であっさり駄目だった。

とりあえず、Windows鯖をかまして、バッチコピーは出来たから良いか。(  ̄σ・・  ̄ )ホジ

2010-12-16

Zend Server for i5 CE で複数のインスタンスを動かす

| 13:22

随分ご無沙汰のブログですが久々にアップです...。

「Zend Server for i5 CEでphp.iniの設定変えて別インスタンスを起動する事って、出来なくなったのかね?」なんていう、Twitterでのやりとりがありました。「Zend Server(※以下ZS)ではどうよ?」という興味から少し調べてみました。

そもそも、Zend Core(※以下ZC)でさえやった事がなかったのですが、ZC時代は、IHS(IBM HTTP Server)に対してリバースプロキシをしていたのですが、ZSになりIHSに対して直接FasgCGIモジュールとして動作するようになりました。ZC時代はアパッチを含んでいたので、そのデーモンを別途起動するだけなんでしょうと勝手に推測。

ZSは「IHSのインスタンス新たに作って、設定ファイルコピればいいんじゃね?」と思ったので検証しました。試す場合には自己責任でお願いします。

前提としては、ドキュメントルートを共用する場合を想定して、行いました。

動作環境
    • IBMi V5R4M0
    • Zend Server for i5 CE 5.0.2 (PHP 5.3)

IHSインスタンスの作成

IHSのインスタンスを作成するには、IHSの管理画面にアクセスします。管理画面は、STRTCPSVR *HTTP の*ADMINインスタンスが起動されている必要があります。手順は以下の通りです。

    • 任意のインスタンス名を付ける
    • アプリケーションのルートディレクトリを指定する。この時既存の/www/zendsvrを使用します。設定を新たに作るかどうか?のラジオボタンがあるので、既存を使用するを選びます。
    • ドキュメントルートディレクトリを指定する。
    • インスタンスの生成を完了する

■手順のイメージ

f:id:ushiday:20101216122605p:image

f:id:ushiday:20101216122606p:image

f:id:ushiday:20101216122607p:image

f:id:ushiday:20101216122608p:image

f:id:ushiday:20101216122609p:image

インスタンスが出来上がると下の図のようになります。

f:id:ushiday:20101216122610p:image

php.iniの設定

既存のphp.iniをコピーして、新たに作成したインスタンス(この場合はZENDSVR2)用のphp.iniを作成します。

cp -prh /usr/local/zenssvr/etc /usr/local/zendsvr/etc2

f:id:ushiday:20101216122621p:image

HTTPの設定

既存のconfディレクトリをコピーして、httpd.confとfastcgi.conf設定を新たに作成したインスタンス用に変更します。

cp -prh /www/zendsvr/conf /www/zendsvr/conf2

f:id:ushiday:20101216122611p:image

httpd.confのリッスンポートを変更します。デフォルトは10088です。

f:id:ushiday:20101216122612p:image

f:id:ushiday:20101216122613p:image

fastcgi.confの「SetEnv="PHPRC=xxxxx"」で設定されている。php.iniを読み取るリソースディレクトリの設定を変更します。これは先のphp.iniをコピーしたディレクトリになります。この場合は、"/usr/local/zendsvr/etc2"になります。FastCGIについてあまり詳しくないのですが、Apacheの"PHPIniDir"の指定で任意のファイル名を指定できるのとは違い、php.iniのファイル名は決まっている?様です。FastCGIについて...

f:id:ushiday:20101216122614p:image

f:id:ushiday:20101216122615p:image

IHSインスタンスの起動

IHSインスタンスを起動します。これは管理画面でも出来て起動パラメータを指定できるのですが、うまくいきませんでした。自分のログインしたユーザーがCCSID5026だったからかもしれません。後日5035で検証してみます。

※追記 5035だと起動できました。CCSIDには注意しましょう。ちなみに構成やポートの表示は空気読んでくれません。

とりあえず、5250でSTRTCPSVR *HTTP インスタンス名 -f /www/zendsvr/conf2/httpd.confで、IHSインスタンスを起動する事が出来ます。

f:id:ushiday:20101216122617p:image

ジョブの実行状態確認した様子 

f:id:ushiday:20101216122618p:image

動作確認

こんな感じで、別インスタンスで起動しました。ZENDSVRサブシステム(i5コマンドやその他機能)の検証はとれていないので、課題としてその辺りを検証する必要がありますね。

f:id:ushiday:20101216122619p:image

IHSの管理画面について

IHSの管理画面は強制的に、アプリケーションディレクトリconfを見ている様で、ポートや設定は下記の図の様に正しく使えなくなります。そもそも何でconf決め打ちなんだろ?これだと管理画面として使えないので、ドキュメントルート共用したいだけなら、リンク貼ったほうが管理画面はそのまま使えて良いかなとも思うし。ただこの管理画面の設定表示は、includeとかするとエラー扱いになったりで個人的感想としては、「もう一歩なんだけどなぁ」と言った感じです。

f:id:ushiday:20101216122620p:image

f:id:ushiday:20101216122604p:image