[PHP-users 34830] PHP PEARでOracleにアクセスするにはどうすればいいでしょうか。

View: New views
10 Messages — Rating Filter:   Alert me  

[PHP-users 34830] PHP PEARでOracleにアクセスするにはどうすればいいでしょうか。

by kondo :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

近藤です。

お世話になります。

Oracleが入ってないサーバAからORACLEが稼動しているサーバBにPHPでアクセス
したいと思っています。
インターネットで検索しながら試行錯誤していますが、なかなかつながらないので、
助言をいただければと思います。
PHPからOracleへのアクセスは大きく分けてPHPのコンパイル、PEARのパッケージ、
ZendFrameworkを使うの3種類あるようなことが判ったので、PHPのアップデートを
考えるとPHPをソースからコンパイルするのは避けたく、ZendFrameworkは使ったこと
が無かったのでPEARで行こうかと思い、挑戦中です。

サンプルを参考に、以下の接続プログラムを作りましたが、つながりません。
気になるのが、'oci8://ユーザ名:パスワード@IPアドレス:ポート番号/DB名';
と指定しているのにMDB2::connect($dsn)すると、エラーが
「** oci8(oci8)://DB名:xxx@IPアドレス:ポート番号/DB名"」
となることです。
何故かユーザ名がDB名に置き換わってます。

どうすれば接続できますでしょうか?
助言の方をよろしくお願いします。

■接続テストプログラム
<?php
require_once 'MDB2.php';

$dsn = 'oci8://ユーザ名:パスワード@IPアドレス:ポート番号/DB名';

$mdb2 =& MDB2::connect($dsn);
if (PEAR::isError($mdb2)) {
        //var_dump($mdb2);
        var_dump($mdb2->getuserinfo());
        die($mdb2->getMessage()."\n");
}else{
        print "Success!!\n";
        //クエリを実行します
        $res =& $mdb2->query('SELECT * FROM テーブル名');
        // 結果がエラーでないかどうかを常にチェックします
        if (PEAR::isError($res)) {
                die($res->getMessage());
        }else{
                print "Success!!\n";
        }
}
$mdb2->disconnect();
?>

■実行結果
# php test.php
string(254) "_doConnect: [Error message: unable to establish a connection]
[Native code: 12162]
[Native message: ORA-12162: TNS: 指定されたNetサービス名は正しくありません。]

 ** oci8(oci8)://DB名:xxx@IPアドレス:ポート番号/DB名"
MDB2 Error: connect failed

■サーバA側
・OSはRedHatEL5です。
・サーバAにはoracle-instantclient11.2をインストールしました。

・環境変数は、以下のような実行してます。
export
PATH=$PATH:/usr/lib/oracle/11.2/client/bin/:/usr/lib/oracle/11.2/client/lib/
export NLS_LANG=JAPANESE_JAPAN.AL32UTF8
export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client/lib/
export ORACLE_HOME=/usr/lib/oracle/11.2/client/
export TNS_ADMIN=/usr/lib/oracle/11.2/client/network/admin/

※「sqlplus ユーザ名/パスワード@DB名」だと接続できます。

・/usr/lib/oracle/11.2/client/network/admin/tnsnames.oraの内容
------------------------------------------------------------
DB名 =
  (DESCRIPTION=
    (ADDRESS_LIST=
        (ADDRESS =
          (COMMUNITY=tcp.world)
          (PROTOCOL=TCP)
          (Host=IPアドレス)
          (Port=ポート番号)
        )
    )
    (CONNECT_DATA=(SID=SID)
    )
  )
------------------------------------------------------------

・PHPパッケージ
# rpm -qa | grep php・・・PHPのバージョン
php-pear-1.4.9-4.el5.1
php-pdo-5.1.6-23.2.el5_3
php-mysql-5.1.6-23.2.el5_3
php-devel-5.1.6-23.2.el5_3
php-common-5.1.6-23.2.el5_3
php-ldap-5.1.6-23.2.el5_3
php-cli-5.1.6-23.2.el5_3
php-mbstring-5.1.6-23.2.el5_3
php-5.1.6-23.2.el5_3

・PEARのインストールパッケージ
PEARのMDB2,MDB2_Driver_oci8をインストール
# pear list
Installed packages, channel pear.php.net:
=========================================
Package          Version State
Archive_Tar      1.3.1   stable
Console_Getopt   1.2     stable
DB               1.7.13  stable
MDB2             2.4.1   stable
MDB2_Driver_oci8 1.4.1   stable
PEAR             1.4.9   stable
XML_RPC          1.5.0   stable

・PHPでOCI8が認識されているか
# php -i | grep oci8
oci8
oci8.connection_class => no value => no value
oci8.default_prefetch => 100 => 100
oci8.events => Off => Off
oci8.max_persistent => -1 => -1
oci8.old_oci_close_semantics => Off => Off
oci8.persistent_timeout => -1 => -1
oci8.ping_interval => 60 => 60
oci8.privileged_connect => Off => Off
oci8.statement_cache_size => 20 => 20


_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

[PHP-users 34831] Re: PHP PEARでOracleにアクセスするにはどうすればいいでしょうか。

by KAMIJO.Yasuyoshi :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

上條@自宅と申します。

 kondoさん、お世話になります。

> サンプルを参考に、以下の接続プログラムを作りましたが、つながりません。
> 気になるのが、'oci8://ユーザ名:パスワード@IPアドレス:ポート番号/DB名';
> と指定しているのにMDB2::connect($dsn)すると、エラーが
> 「** oci8(oci8)://DB名:xxx@IPアドレス:ポート番号/DB名"」
> となることです。
> 何故かユーザ名がDB名に置き換わってます。

 DB名の指定が間違っていませんか。

> # php test.php
> string(254) "_doConnect: [Error message: unable to establish a connection]
> [Native code: 12162]
> [Native message: ORA-12162: TNS: 指定されたNetサービス名は正しくありません。]
>
>  ** oci8(oci8)://DB名:xxx@IPアドレス:ポート番号/DB名"
> MDB2 Error: connect failed

 ORA-12162はPEARの問題ではなく、TNSNAMES.ORA内の記述と接続文字列の記
 述に誤りがあることを示しています。

 エラーメッセージの解説より引用
---------------------------------------------------------------------------
 「TNS: 指定されたNetサービス名は正しくありません。」
 「TNSNAMES.ORA内またはディレクトリ・サーバー(Oracle Internet Directory)
 内のネット・サービス名に対応する接続記述子が誤って指定されています。」
 「ローカル・ネーミングを使用している場合は、TNSNAMES.ORAファイル内で対応
 する接続記述子に構文エラーがないことを確認してください。ディレクトリ・ネ
 ーミングを使用している場合は、ディレクトリ・ネーミング用に管理を介して提
 供された情報を確認してください。」
---------------------------------------------------------------------------

> ■サーバA側
> ・OSはRedHatEL5です。
> ・サーバAにはoracle-instantclient11.2をインストールしました。

 これはサーバAの方ですよね。
 サーバaより次のコマンドをチェックしてみてください。
 >TNSPING DB名

> ・/usr/lib/oracle/11.2/client/network/admin/tnsnames.oraの内容
> ------------------------------------------------------------
> DB名 =
>   (DESCRIPTION=
>     (ADDRESS_LIST=
>         (ADDRESS =
>           (COMMUNITY=tcp.world)
>           (PROTOCOL=TCP)
>           (Host=IPアドレス)
>           (Port=ポート番号)
>         )
>     )
>     (CONNECT_DATA=(SID=SID)
>     )
>   )
> ------------------------------------------------------------

 sql*plusから接続可能とのことですが、DB名に何を指定していますか?


 以上、再チェックをよろしくお願いいたします。


 ● 作成者:上條 靖芳 e-mail:yasuyoshi_kamijo@...  ●
                         blog:http://blogs.dion.ne.jp/yasuyoshi/
 on DELL Vostro 1520 Genuine Intel(R) CPU 2.00GHz WinXP SP3
 Becky! 2.52.00_ja + VB2008 EE + IE8.0 + Oracle11gR1(11.1.0.7)
_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

[PHP-users 34832] Re: PHP PEARでOracleにアクセスするにはどうすればいいでしょうか。

by kondo :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

近藤です。

助言ありがとうございます。

>  ORA-12162はPEARの問題ではなく、TNSNAMES.ORA内の記述と接続文字列の記
>  述に誤りがあることを示しています。

そういうことでしたか。

>  これはサーバAの方ですよね。
>  サーバaより次のコマンドをチェックしてみてください。
>  >TNSPING DB名

はい、サーバA側です。
TNSPINGですが、コマンドが無かったです。(tnspingでも無いようです。)

oracle-instantclient11.2-basic-11.2.0.1.0-1
oracle-instantclient11.2-sqlplus-11.2.0.1.0-1
oracle-instantclient11.2-devel-11.2.0.1.0-1
を入れましたが、この中には無かったのかもしれません。

>  sql*plusから接続可能とのことですが、DB名に何を指定していますか?

先ほどのメールの中のDB名、ユーザ名、パスワード、IPアドレス、ポート番号、SIDは

伏せさせてもらうために置換しました。
プログラム、tnsnames.ora、sqlplutで同じ文言の部分は同じと思ってください。

そのため、tnsnames.oraでDB名となっていた部分と同じになります。

tnsnames.oraをもう一度見直してみます。
ありがとうございました。

_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

[PHP-users 34833] Re: PHP PEARでOracleにアクセスするにはどうすればいいでしょうか。

by KAMIJO.Yasuyoshi :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

上條@自宅と申します。

 kondoさん、お世話になります。

> >  これはサーバAの方ですよね。
> >  サーバaより次のコマンドをチェックしてみてください。
> >  >TNSPING DB名
>
> はい、サーバA側です。
> TNSPINGですが、コマンドが無かったです。(tnspingでも無いようです。)

 Instantckientでしたね。
 失礼しました。InstantClientにはTNSPINGは入っていませんでした。

> >  sql*plusから接続可能とのことですが、DB名に何を指定していますか?
>
> 先ほどのメールの中のDB名、ユーザ名、パスワード、IPアドレス、ポート番号、SIDは
>
> 伏せさせてもらうために置換しました。
> プログラム、tnsnames.ora、sqlplutで同じ文言の部分は同じと思ってください。
>
> そのため、tnsnames.oraでDB名となっていた部分と同じになります。

 サーバBのOracleDBServerのバージョンをお知らせ下さい。
 例えば、11.1.0.7のように、ドットを3つまでお示し下さい。
 サーバb側のバージョンがあまりにも低いと接続できないかも。。。
 でも、sql*plusでは接続できるから、通常はプログラムからの接続も可能
 となりますが。。。

> tnsnames.oraをもう一度見直してみます。

 サーバBのTnsnames.oraと合わせてみるのも手です。


 以上、よろしくお願いいたします。


 ● 作成者:上條 靖芳 e-mail:yasuyoshi_kamijo@...  ●
                         blog:http://blogs.dion.ne.jp/yasuyoshi/
 on DELL Vostro 1520 Genuine Intel(R) CPU 2.00GHz WinXP SP3
 Becky! 2.52.00_ja + VB2008 EE + IE8.0 + Oracle11gR1(11.1.0.7)
_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

[PHP-users 34834] Re: PHP PEARでOracleにアクセスするにはどうすればいいでしょうか。

by kondo :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

近藤です。

レスポンスが遅れてすみません。

OracleDBのサービス名は、SID=の部分に記入したSIDの部分だったようです。

>  サーバBのOracleDBServerのバージョンをお知らせ下さい。
>  例えば、11.1.0.7のように、ドットを3つまでお示し下さい。
>  サーバb側のバージョンがあまりにも低いと接続できないかも。。。
>  でも、sql*plusでは接続できるから、通常はプログラムからの接続も可能
>  となりますが。。。

Oracleのバージョンは、10.2.0.3ということでした。

ISにシステム開発から管理を任せていたのですが、システムにかなり難があり、
(開発しなおす費用がないので)データからこちらで欲しい情報を作成しない
といだめだなーという状況で、PHPからのアクセスをまずできるように
すべく、このような質問をさせてもらってました。

MySQLならPHPでアクセスしやすいのですが、Oracleについては不慣れなもので...

_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

[PHP-users 34835] Re: PHP PEARでOracleにアクセスするにはどうすればいいでしょうか。

by kondo :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

近藤です。

何とか接続できるようになりましたので報告します。

ただ、やったことが正しいことかわかりません。

行ったことは以下のような感じです。

tnsnames.oraを見直してもなかなかつながらない。
tnsnames.oraを変更すると、PHPでつながらないどころか
sqlplusでもつながらなくなる。

ということから、発想の転換をし、PEARのどこでエラーになっているのか?
という疑問になり、PEARのソースコードを参照。
/usr/share/pear/MDB2.phpから見ていき、/usr/share/pear/MDB2/Driver/oci8.php
を見ていくと、途中でusernameが書き換わっているところを発見。
とりあえず書き換わる部分をコメントアウトして書き換わらないようにしてみる。

function connect()の
$this->dsn['username'] =
$this->options['database_name_prefix'].$this->database_name;
の部分のコメントアウト

それでもつながらないのでさらに見ていくと

$sid = sprintf("(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)
                             (HOST=%s) (PORT=%s)))
                             (CONNECT_DATA=(SERVICE_NAME=%s)))",
という部分があり、「(CONNECT_DATA=(SERVICE_NAME=%s))」に着目。

tnsnamed.oraに(CONNECT_DATA=(SERVICE_NAME=SID)を足してみる・・・NG
tnsnamed.oraの(CONNECT_DATA=(SID=RMS3)を
      (CONNECT_DATA=(SERVICE_NAME=SID)に変更してみる・・・NG
tnsnamed.oraを元に戻し、oci8.phpの「(CONNECT_DATA=(SERVICE_NAME=%s)))",」
を「(CONNECT_DATA=(SID=%s)))",」に変更してみる・・・OK

エラーが出なかっただけで本当につながったのか確認するために、

Webのサンプルプログラムを参考に
                while (($row = $res->fetchRow())) {
                        var_dump($row );
                }
を追加して実行した結果、
データベースの内容が出てきました。

pearのソースを修正したわけですが、果たしてよかったでしょうか?

_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

[PHP-users 34836] Re: PHP PEARでOracleにアクセスするにはどうすればいいでしょうか。

by HOTTA Michihide :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

堀田@長崎市です。

From: "kondo" <nobuaki3.kondo@...>
To: "PHP-users ML" <php-users@...>
Date: Fri, 6 Nov 2009 15:56:29 +0900
Subject: [PHP-users 34830] PHP PEARでOracleにアクセスするにはどうすればいいでしょうか。

> Oracleが入ってないサーバAからORACLEが稼動しているサーバBにPHP
> でアクセスしたいと思っています。

直接の回答ではないですが、ウチの職場では pdo でやっています。

m-hotta@gtr:~$ cat /etc/redhat-release
CentOS release 5.3 (Final)

m-hotta@gtr:~$ rpm -qa|grep -E '^(php|ora)' | sort
oracle-instantclient-basic-10.2.0.3-1
oracle-instantclient-sqlplus-10.2.0.3-1
php-5.2.8-4.npuc
php-cli-5.2.8-4.npuc
php-common-5.2.8-4.npuc
php-ldap-5.2.8-4.npuc
php-mbstring-5.2.8-4.npuc
php-mysql-5.2.8-4.npuc
php-oci8-5.2.8-4.npuc
php-pdo-5.2.8-4.npuc
php-pear-1.4.9-4.el5.1
php-pear-Auth-SASL-1.0.2-4.el5.centos
php-pgsql-5.2.8-4.npuc

<?php
//----------------------------------------------------------------
//  DB接続処理    for PDO
//----------------------------------------------------------------
$ora_db_string = 'oci:dbname=//fqdn/dbname';
try {
    $ora_db = new PDO($ora_db_string, $username, $password);
}
catch(PDOException $e) {
    echo $e->getMessage();
    die("Could not connet \"$ora_db_string\"\n");
}
$ora_db->exec("SET NAMES 'UTF-8'");
?>

という感じです。これでひとつのアプリから Oracle とポスグレの両方
に接続しています。CLI でしか使ってませんが…。

--
HOTTA Michihide <hotta@...>
_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

[PHP-users 34837] Re: PHP PEARでOracleにアクセスするにはどうすればいいでしょうか。

by kondo :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

近藤です。

CentOS5.3で「php-5.2.8-4」ということですが、
PHPはソースから構築しているのでしょうか。

Redhathaどうやらまだ5.1.6のようです。
CentOSはRedHatのソースから再構築されたものだと思ってますので、
各パッケージのバージョン自体はCentOSもRedHatも同じかと思いますが、
違うということはソースから新たに構築しているのかなとおもいました。

各パッケージのアップデートとかを考えるとソースからの
構築は避けようと思ってます。

_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

[PHP-users 34838] Re: PHP PEARでOracleにアクセスするにはどうすればいいでしょうか。

by HOTTA Michihide :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

堀田@長崎市です。

From: "kondo" <nobuaki3.kondo@...>
To: "PHP-users ML" <php-users@...>
Date: Thu, 12 Nov 2009 15:19:52 +0900
Subject: [PHP-users 34837] Re: PHP PEARでOracleにアクセスするにはどうすればいいでしょうか。

> 近藤です。
>
> CentOS5.3で「php-5.2.8-4」ということですが、
> PHPはソースから構築しているのでしょうか。
>
> Redhathaどうやらまだ5.1.6のようです。
> CentOSはRedHatのソースから再構築されたものだと思ってますので、
> 各パッケージのバージョン自体はCentOSもRedHatも同じかと思いますが、
> 違うということはソースから新たに構築しているのかなとおもいました。
>
> 各パッケージのアップデートとかを考えるとソースからの
> 構築は避けようと思ってます。

よく使うパッケージで、かつ新し目のものを使いたい場合、もしくは
本家のパッケージで必要な機能が入っていない場合(例:isc-dhcpd
の ldap support 等)については、自前で RPM パッケージを作って職
場の yum リポジトリサーバに置いて使っています。管理するサーバの
台数が多いのと、ビルドのやり方忘れた ;-) ので、さすがに tar ball
から入れることはないですね。

# Oracle が動いているサーバに関してはノータッチなので、どうやっ
# て構築しているかは知りません。

--
HOTTA Michihide <hotta@...>
_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

[PHP-users 34839] Re: PHP PEARでOracleにアクセスするにはどうすればいいでしょうか。

by kondo :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

近藤です。

> よく使うパッケージで、かつ新し目のものを使いたい場合、もしくは
> 本家のパッケージで必要な機能が入っていない場合(例:isc-dhcpd
> の ldap support 等)については、自前で RPM パッケージを作って職
> 場の yum リポジトリサーバに置いて使っています。管理するサーバの
> 台数が多いのと、ビルドのやり方忘れた ;-) ので、さすがに tar ball
> から入れることはないですね。

やはり、少々特殊な環境のようですね。(私から見てかもしれません)

こちらの職場ではできるだけデフォルトパッケージでやりたいもので、
RedHatで提供されているものはRedHatのバージョンでやっております。

私の勘違いかもしれませんが、5.1.6だとPDOは使えないのかなと思ってました。
とりあえず、PEARのMDB2で使えたので良かったです。

_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3