- 締切済み
PEARでOracleへ接続時にエラー
Linuxサーバ環境でpearを用いてPHPからOracleに接続したいのですがうまくいきません。 <?php require_once("DB.php"); $dsn = "oci8://SCOTT:tiger@DBサーバIP/DB名"; $db = DB::connect($dsn); if (DB::isError($db)) { echo "接続エラー"; } else { echo "接続成功"; } ?> というPHPにアクセスすると、接続エラーとしか表示されません。 接続先のDBに該当のユーザは存在しており、このWebサーバからSQLplusで sqlplus scott/tiger@//DBサーバIP:1521/DB名 で接続はできております。 OS:CentOS 5.2 (VMWare上で稼働) カーネル:2.6.18-92.el5 Apache:2.2.9 PHP:5.2.6 PHP-PEAR:1.4.9 接続先Oracle:9.2.0.1.0 (イントラ同セグメント内で稼働) 尚、同様の方法でWebサーバ内で稼働しているMysqlへは問題なく接続できております。 以上、心当たりのある方がいらっしゃいましたらお願い致します。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- mookun2007
- ベストアンサー率59% (28/47)
ん~PEARで接続できない原因がちょっとわかりませんが・・ 私の環境ですと普通に接続できるんですけどね。 気になる点としては、 phpのcofigureオプションで > --with-oci8=instantclient,/usr/local/lib/instantclient_10_2 \ これですが、この下にlibディレクトリはありませんか? libディレクトリまでのパスを指定すると思うのですが。 あと、外してるかもしれませんが --enable-sigchild これも必要かもしれません。 > ちなみにご指摘の > ・apacheの環境変数にoracle用環境変数を設定 > は、DSNを上記スクリプトのように直指定する場合も必要なのでしょ> うか… apacheの実行ユーザに最低限以下のORACLE環境変数を設定する必要があります。 LD_LIBRARY_PATH(oracleinstantclientにあるlibディレクトリ) NLS_LANG(使用する言語japanese_japan.ja16eucなど) NLS_LANGを指定しないとマルチバイトが化けると思います。
- mookun2007
- ベストアンサー率59% (28/47)
まず、PEAR云々の前にPHPからORACLEへ接続はできるのでしょうか? phpinfoを見て、ORACLEの項目は表示されますか? PHPでoracleを利用するためには、 ・phpのoracleモジュールのインストール ・apacheの環境変数にoracle用環境変数を設定 ・oracleクライアントのインストール など、Mysqlなどと比べてやらなくてはいけないことがたくさんあります。
お礼
【回答への補足】への補足 上記スクリプトの echo "接続エラー"; の下に、 print $db->getMessage(); を追加したところ… と書きましたが、上記スクリプトとは最初の質問文のスクリプトの事です。 分かりづらくてすみません。
補足
回答ありがとうございます。 質問した後いろいろ試してPHPからORACLEへの接続は可能な状態になっております。 (以下スクリプトで確認) <?php $con = oci_connect("scott","tiger","//サーバIP:1521/DB名"); $sql = "select sysdate from dual"; $stmt = oci_parse($con, $sql); $results = oci_execute($stmt); $row = oci_fetch_row($stmt); echo $row[0] . "\r\n"; oci_close($con); ?> で、システム日付が返ってきます。 ちなみにクライアントはOracleインスタントクライアント10.1.0.4-1を利用、PHPのconfigureオプションは、 ./configure \ --with-oci8=instantclient,/usr/local/lib/instantclient_10_2 \ --with-apxs2=/usr/local/apache2/bin/apxs \ --with-config-file-path=/usr/local/apache2/conf \ --enable-mbstring \ --enable-zend-multibyte といった感じです。 上記スクリプトの echo "接続エラー"; の下に、 print $db->getMessage(); を追加したところ、 DB Error: connect failed と表示されました oci_connectできたので無理にpearを使う必要ないのかもしれませんが… このままでは少し気持ち悪いです。 ちなみにご指摘の ・apacheの環境変数にoracle用環境変数を設定 は、DSNを上記スクリプトのように直指定する場合も必要なのでしょうか…
補足
回答ありがとうございます。 (1)PHPのコンパイルについて --enable-sigchildを追加してコンパイル&インストールし直しました。 (2)Oracleインスタントクライアントについて >> --with-oci8=instantclient,/usr/local/lib/instantclient_10_2 \ >これですが、この下にlibディレクトリはありませんか? >libディレクトリまでのパスを指定すると思うのですが。 libディレクトリはありませんでした。 導入したOracleインスタントクライアントはbasicとsdk(あとsqlplus)で、いずれも上記ディレクトリへ解凍しましたが、libディレクトリは入っていない模様です。 (3)apacheの環境変数について 何気なく参考サイトを見ながら設定してたみたいです(汗) 【設定ファイル】 /usr/local/apache2/bin/envvars 【設定内容】 LD_LIBRARY_PATH="/usr/local/apache2/lib:$LD_LIBRARY_PATH" export LD_LIBRARY_PATH export LD_LIBRARY_PATH=/usr/local/lib/instantclient_10_2:$LD_LIBRARY_PATH NLS_LANG=Japanese_Japan.AL32UTF8 export NLS_LANG でダメで、 TNS_ADMIN=/usr/local/lib/instantclient_10_2 をここに追記して、 /usr/local/lib/instantclient_10_2/tnsnames.ora を作成して、 TNS名 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = DBサーバIP)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = DBサーバ上のサービス名) ) ) を作成してみましたが、結果変わらずです。 mookun2007さんは普通のOracleクライアント(インスタントでない)をお使いでしたでしょうか? またTNSの設定状況についても自信が無いので、参考までにmookun2007さんの設定状況を教えて頂く事は可能でしょうか?