ORACLE TECHNOLOGY NETWORK
 
 
   

Oracle Technology Network (OTN) Japan - 掲示板 » テクノロジー » プログラミング一般

スレッド: PHP5.2.5からOracle10gへの接続

このスレッドに返信する このスレッドに返信する スレッド一覧へ スレッド一覧へ

Permlink 返信数: 12 - ページ数: 1 - 最新投稿 : 2010/08/12 13:33 最新投稿者: satoru_yoshida - スレッド表示形式: スレッド: [ 前へ | 次へ ]
1089214

投稿数: 2
登録日時: 07/07/28


PHP5.2.5からOracle10gへの接続
投稿時刻: 2008/12/01 17:29
  このスレッドに返信します… 返信

環境:Apache2.2.8+Oracle10gR2(10.0.2.3)+PHP5.2.5+CentOS4.6

oci_connectで、Oracleへ接続しようとすると、

Warning: oci_connect() [function.oci-connect]:
OCIEnvNlsCreate() failed.
There is something wrong with your system - please check
that ORACLE_HOME is set and points to the right directory
in /usr/local/apache/htdocs/demo/db_connect.php on line 3

というエラーが発生します。
いろいろ調べてみて、

chmod o=x $ORACLE_HOME/network
chmod o=x $ORACLE_HOME/network/admin
chmod o=r $ORACLE_HOME/network/admin/tnsnames.ora
chmod o=r $ORACLE_HOME/nls
chmod o=r $ORACLE_HOME/nls/data
chmod o=r $ORACLE_HOME/nls/data/*
chmod o=x $ORACLE_HOME/oracore
chmod o=x $ORACLE_HOME/oracore/zoneinfo
chmod o=r $ORACLE_HOME/oracore/zoneinfo/timezlrg.dat
chmod o=r $ORACLE_HOME/rdbms
chmod o=r $ORACLE_HOME/rdbms/mesg
chmod o=r $ORACLE_HOME/rdbms/mesg/*

の箇所の権限を変更するところまでは、実行したのですが、問題解決には
いたりませんでした。
このほかに、行うことはあるのでしょうか?

ご存知の方いましたら、ご教授ください。
足りない情報がありましたら、追記いたします。
よろしくお願いします。

tabizou

投稿数: 451
登録日時: 05/10/14


Re: PHP5.2.5からOracle10gへの接続
投稿時刻: 2008/12/01 17:52   1089214 さんへの返信です。 1089214 さんへの返信です。
  このスレッドに返信します… 返信

http://otndnld.oracle.co.jp/tech/opensource/htdocs/php/inst_php_apache_linux/inst_php_apache_linux.html
に従って設定していますか?
# 10.0.2.3でも同じではないかと
# instant client で逃げるのもありかなと(たぶん)
> 注意: Oracle Database 10.2を使用している場合は、Oracleディレクトリに対する
> アクセス権を「nobody」に設定する必要があります。
> Oracle 10.2.0.2の場合は、これを設定するスクリプト
> $ORACLE_HOME/install/changePerm.shがあります

# バージョン指定がない場合は、5.2.6が最新版なのでそちらを
# 使ったほうが吉だと思うのですが>PHP

1089214

投稿数: 2
登録日時: 07/07/28


Re: PHP5.2.5からOracle10gへの接続
投稿時刻: 2008/12/02 15:30   tabizou さんへの返信です。 tabizou さんへの返信です。
  このスレッドに返信します… 返信

教えていただいたページも、参照して試してみましたが、結果は変わりませんでした。
インスタントクライアントでは、正常に動作することを確認しました。

不思議なので、再度環境を作り直しています。
ありがとうございました。

satoru_yoshida

投稿数: 6
登録日時: 09/02/09


Re: PHP5.2.5からOracle10gへの接続
投稿時刻: 2009/02/09 11:41   1089214 さんへの返信です。 1089214 さんへの返信です。
  このスレッドに返信します… 返信

皆さん始めまして
類似の現象が php 5.2.6及びOracle Instant Client 10.2.0.4の組み合わせで Solaris上で発生しますのでレポートします。

とあるBtoCシステムにて1~3日程度の期間に一回5分間程度連続して oci_connectで warningが発生します。
同一のphpソースに関わらずその5分間にwarningを発生するoci_connectもあれば、発生しないoci_connectもあります。

php 5.2.6 のソースを追いかけながら、oci_connectに与える引数を変えて試してみましたところ、 ext/oci8/php_oci8_int.h の485から489行目で定義されている OCI_G(v)そのものがエラーを返していると考えられます。

以上ご参考まで

satoru_yoshida

投稿数: 6
登録日時: 09/02/09


Re: PHP5.2.5からOracle10gへの接続
投稿時刻: 2009/02/15 12:02   satoru_yoshida さんへの返信です。 satoru_yoshida さんへの返信です。
  このスレッドに返信します… 返信

その後の経過です

oci_globals.v を php_oci8_int.h では OCI_G(v)として定義して使用しており、php のoci8 エクステンションのソースコードに関わったメンバーからはoci_globals は Oracle Client Instance を指している、との情報をもらいました。

Oracle のデータベースにクライアントが接続を試みたうち、何万回かに1回未満のオーダーでエラーと判断できる値を OCI_G(error) すなわり oci_globals.error が返します。

oci_globals.<プロパティー名> でOracle Clientのプロパティー値の取得・設定を行っているように見えます。

問題解決のためには、PHPのソースコードを追うだけではもう手がかりが無いので、エンドユーザーを通じてOracle社に問い合わせをしたのですが、。。。

「Oracle側に問題があるという明確な証拠が無い限りOracle 内部の調査はしません」だそうです。

お客様が困っているトラブルを協力して解決しよう、と当方では考えていて、責任追及が目的じゃないのにね。

Chip'n Mole

投稿数: 466
登録日時: 07/02/20


Re: PHP5.2.5からOracle10gへの接続
投稿時刻: 2009/02/16 7:50   satoru_yoshida さんへの返信です。 satoru_yoshida さんへの返信です。
  このスレッドに返信します… 返信

それなら「これより明確にするのはどうすればよいですか ?」って、ずっと
前向きにとりくむのが吉だと思います。

もうされているのかもしれませんが、
PHP Developer Center
http://www.oracle.com/technology/tech/php/
から辿れる資料なのでご紹介しますが、
THE UNDERGROUND PHP AND ORACLE MANUAL
http://www.oracle.com/technology/tech/php/pdf/underground-php-oracle-manual.pdf
の253ページに
APPENDIX A
TRACING OCI8 INTERNALS
と oci_internal_debug() の説明があり、他のページにサンプルがあるので
Oracle PHP Troubleshooting FAQ
http://www.oracle.com/technology/tech/php/htdocs/php_troubleshooting_faq.html
なども参考に、
http://www.oracle.com/technology/forums/php.html
で投稿してみるというのもありだと思います。

接続切断を行うサンプルを 10万回ループさせるように作って、これを実行
しているとだいたい数回に1回出るとかすれば、実行してみるだけで済む
ような形になるので、やってくれる方はやってくれると思います。

環境依存だと、ちょっと本当の解決は難しそうな気がしますが、そうでない
なら出るって言う声を上げる仲間を増やすのも手ですよね。

satoru_yoshida

投稿数: 6
登録日時: 09/02/09


Re: PHP5.2.5からOracle10gへの接続
投稿時刻: 2009/02/16 11:56   Chip'n Mole さんへの返信です。 Chip'n Mole さんへの返信です。
  このスレッドに返信します… 返信

Chip'n Mole さん、レスポンスありがとうございます。

oci_internal_debug()はoci8 の内部の実行経路の特定に役立ちます −> oci8.cのどの行のOCI_G()か特定済み

Oracle PHP Troubleshooting FAQも確認済み

Oracle Instant Client 9.2.0.5と php 4.3.8 から Oracle Instant Client 10.2.0.3と php 5.2.6 の組み合わせ(他にも各種のライブラリーのVersion upあり)に移行したことによって新たに発生したトラブルです。

Chip'n Mole

投稿数: 466
登録日時: 07/02/20


Re: PHP5.2.5からOracle10gへの接続
投稿時刻: 2009/02/18 1:58   satoru_yoshida さんへの返信です。 satoru_yoshida さんへの返信です。
  このスレッドに返信します… 返信

こちらこそ、どうもありがとうございます。
ひとつひとつライブラリ外してみるとか、結構地道に探っていかないと難しそうですが、
http://www.oracle.com/technology/software/tech/oci/instantclient/index.html
には、10.2.0.4とか11.1.0.7もありますので、別ディレクトリに配置してみて使って
試してみるというのも、方法としてはありますね。

ちょっと無責任な感じがしちゃうかもしれませんが、やってみてあっさり片付いたら、
なんだか調べるのにかかったあの作業はいったいなんだったのだろうなーと思える
ことも自分はあるので、書いてみました。

satoru_yoshida

投稿数: 6
登録日時: 09/02/09


Re: PHP5.2.5からOracle10gへの接続
投稿時刻: 2009/02/26 15:15   Chip'n Mole さんへの返信です。 Chip'n Mole さんへの返信です。
  このスレッドに返信します… 返信

下記に投稿を行いました。こちらからも参照できるように記載します。
http://bugs.php.net/bug.php?id=47506

Chip'n Mole

投稿数: 466
登録日時: 07/02/20


Re: PHP5.2.5からOracle10gへの接続
投稿時刻: 2009/03/02 4:18   satoru_yoshida さんへの返信です。 satoru_yoshida さんへの返信です。
  このスレッドに返信します… 返信

http://bugs.php.net/bug.php?id=47506 を拝見したのですが、PHP 5.2.8 を
使って実行しても発生しているということでしょうか ?
また、とあるBtoCシステムの環境でしか発生しないのではなくて Solaris
Sparc 9の別のマシンでもほぼ同じ頻度で発生したということでしょうか ?
OTN-J掲示板には掲載できない内容かもしれませんが、少し各サイトの話題の
間というか差と、PHPのバージョンが上げられるのならOracle Instant Client
がなぜ上げられないのかなどが多少気になってしまいました。
問題解決の勉強になる有意義な話題だと感じているため、もしよろしければ
若干教えていただけると幸いです。
トラブル対応上たいへんな状況下であり、様々な事情があるかと思いますし、
単に私自身が気になっただけといえばそれまでですので、もちろんお返事
いただかなくとも結構です。

引き続き拝見させていただきます。

satoru_yoshida

投稿数: 6
登録日時: 09/02/09


Re: PHP5.2.5からOracle10gへの接続
投稿時刻: 2009/03/19 11:39   Chip'n Mole さんへの返信です。 Chip'n Mole さんへの返信です。
  このスレッドに返信します… 返信

その後の経過ですが、Oracle Instant Client 10.2.0.3及び php 5.2.6共にいまだVersion upはできていません。
残念ながら bugs.php.netのレポート画面ではphpの古いバージョンを受け付けてくれませんので、 php の5.2.6のC言語のソースコードと 5.2.8のソースコードを比較して oci8エクステンションに関して同一であることを確認したうえで投稿いたしました。

なお、2月9日11時に投稿した際に Oracle Instant Client を10.2.0.4と記載しましたが、これは私の誤りです。2月16日11時に投稿した際の10.2.0.3が正です。

問題が起きているSolarisは本番機1機です。
テスト機ではいまだ再現できていないためVersion upが必要かどうかも含め原因の特定に到っていません。

Chip'n Mole

投稿数: 466
登録日時: 07/02/20


Re: PHP5.2.5からOracle10gへの接続
投稿時刻: 2009/04/03 1:31   satoru_yoshida さんへの返信です。 satoru_yoshida さんへの返信です。
  このスレッドに返信します… 返信

教えていただいてどうもありがとうございます。

http://bugs.php.net/report.php では Earlier? Upgrade first! と書かれているのですね

satoru_yoshida

投稿数: 6
登録日時: 09/02/09


Re: PHP5.2.5からOracle10gへの接続
投稿時刻: 2010/08/12 13:26   Chip'n Mole さんへの返信です。 Chip'n Mole さんへの返信です。
  このスレッドに返信します… 返信

この件ですが、oci_connect の返り値として、数万回に1回未満のオーダーで、 false でもなく接続リソースでもない値を返し、なおかつ E_WARNING を発生させます。(PHP 5.2.6 ですので、OCI8 の Version は 1.2系です)
 
下記のようにset_error_handlerでコールバック関数を登録して、エラーメッセージが設定されている場合は、返り値を強制的に変更するような回避策が考えられます。
なお、顧客特定防止のため、実際の対策コードとは各所変更しています。
 
class someClass {
protected $_errMsg;

function someFunc($id, $password, $database, $language)
{
$this->_errMsg = NULL;
set_error_handler(array($this, 'someCallBack'), E_WARNING);
$con = oci_connect($id, $password, $database, $language);
restore_error_handler();
if ($this->_errMsg) {
$con = 'someValue';
}
return;
}

public function someCallBack($errNo, $errMsg)
{
$this->_errMsg = $errMsg;
return true;
}
}






ウェブサイトのご使用条件 | 個人情報保護基本方針/情報保護基本方針