Solaris10 + Apache2 + PHP5.2 + Oracle10g
- 2007.01.22
- Solaris
Solari10とApache2とPHP5.2.8とOracle10g 10.2.0.3.0 を組み合わせて使いたい。
Oracle10gが既にインストールされているSolaris10にPHP 5.2.8をインストールした作業の記録。
■インストール方法、参考情報
Oracle Database、PHP、ApacheのLinuxへのインストール
PHPでOracle Databaseを使う(Oracle Instant Clientの場合)
Oracle Database 10g Express Editionを使ったPDO_OCI/OCI8サポート手順
■インストール前の準備
configure時に様々なファイルにアクセスできるよう、ルートユーザになっておく。(大事)
$ su -
念のため、環境変数を設定しておいた。
(Oracle用の環境変数) # ORACLE_HOME=/u01/app/oracle/product/10.2.0 # export ORACLE_HOME # ORACLE_SID=orcl # export ORACLE_SID # NLS_LANG=Japanese_Japan.JA16EUC # export NLS_LANG # LD_LIBRARY_PATH=/usr/openwin/lib:$ORACLE_HOME/lib # export LD_LIBRARY_PATH # PATH=$ORACLE_HOME/bin:$PATH # export PATH (MySQLも使いたいので) # PATH=/usr/local/mysql5/bin:$PATH # export PATH (海外サーバを使っているので、念のため) # TZ=Japan
■PHP5.2.8のインストール
./configure を実行する。–with-oci8で設定するパスは、echo $ORACLE_HOME で調べる。
# ./configure \ --with-apxs2=/usr/apache2/bin/apxs \ --enable-mbstring \ --with-gd \ --with-zlib \ --with-oci8=shared,/u01/app/oracle/product/10.2.0 \ --enable-sigchild \ --enable-zend-multibyte
–with-oci8でsharedを指定すると、静的リンクではなく、拡張モジュールoci8.soが作成される。
MySQLも使いたいので、./configure 時に以下も追加した。
--with-mysql=/usr/local/mysql5 \ --with-mysql-sock=/tmp/mysql5.sock \ --with-mysqli=/usr/local/mysql5/bin/mysql_config
make install を実行する。
# make # make install
make install を実行すると、メッセージの途中でlibtoolを実行せよとの warning が表示された。
libtool: install: warning: remember to run `libtool --finish /usr/local/src/php-5.2.8/libs'
実行してみた。
# libtool --finish /usr/local/src/php-5.2.8/libs ---------------------------------------------------------------------- Libraries have been installed in: /usr/local/src/php-5.2.8/libs If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the `-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the `LD_LIBRARY_PATH' environment variable during execution - use the `-RLIBDIR' linker flag See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages. ----------------------------------------------------------------------
あと、make install の最後に表示されたPEAR情報をメモしておいた。
Installing PEAR environment: /usr/local/lib/php/ [PEAR] Console_Getopt - already installed: 1.2.3 [PEAR] Archive_Tar - already installed: 1.3.2 [PEAR] Structures_Graph- already installed: 1.0.2 [PEAR] PEAR - already installed: 1.7.2 Wrote PEAR system config file at: /usr/local/etc/pear.conf You may want to add: /usr/local/lib/php to your php.ini include_path Installing PDO headers: /usr/local/include/php/ext/pdo/
■設定ファイル php.iniを用意する。
php.ini-dist 一般的なPHP設定。
php.ini-recomended 推奨されるPHP設定。
中身を見て使い勝手の良い方をphp.iniとしてコピーする。コピー先は、PHPのconfigure時に–with-config-file-pathオプションを指定していなければ、初期設定で/usr/local/libになる。
# cp php.ini-dist /usr/local/lib/php.ini
コピーした/usr/local/lib/php.iniを編集する。
/usr/local/lib/php/extensions/no-debug-non-zts-20060613/oci8.soが入っているディレクトリとmbstring.soを指定する。Windows用に書かれたphp_*.dllを*.soの形に直してコメントアウトする。
(変更前) extension_dir = "./" (変更後) extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20060613/" (変更前) ;extension=php_mbstring.dll ;extension=php_oci8.dll (変更後) extension=mbstring.so extension=oci8.so
php_ を削除するのを忘れずに。
■Apache2のhttpd.confの確認と再起動
/etc/apache2/httpd.confの中を確認。下の2行が追加されているか確認して修正する。
LoadModule php5_module libexec/libphp5.so AddType application/x-httpd-php .php
PHPIniDir “/usr/local/lib” は、PHPのconfigure時に–with-config-file-pathオプションを指定していないので必要ない。
Apache再起動の前に文法間違いが無いかを確認する。
# /usr/apache2/bin/httpd -t Syntax OK
Apacheを再起動する。必ず、終了させてから、起動する。
# svcadm disable apache2 # svcadm enable apache2
以下のtest.phpを作ってブラウザからアクセスして、ライブラリパス等の設定情報を確認する。
<?php phpinfo() ?>
■Apache2の起動時にOracle環境変数を設定する
Solarisのapache2の場合、/usr/apache2/bin/envvars に環境変数を追加する。 /etc/init.d/から起動する場合は、apacheの起動スクリプトの最初でOracle環境変数を設定する。
1. Apache実行ユーザにOracle環境変数を与える。
2. Apache実行ユーザにOracleライブラリパスを与える。
この2つをenvvarsファイルに記述する。
/usr/apache2/bin/envvars
ORACLE_BASE=/u01/app/oracle export ORACLE_BASE ORACLE_HOME=/u01/app/oracle/product/10.2.0 export ORACLE_HOME NLS_LANG=Japanese_Japan.JA16UTF8 # NLS_LANG=Japanese_Japan.JA16SJIS # NLS_LANG=Japanese_Japan.JA16EUC export NLS_LANG LD_LIBRARY_PATH="$ORACLE_HOME/lib:/usr/apache2/lib:$LD_LIBRARY_PATH" export LD_LIBRARY_PATH
「設定」と「export」 を1行にまとめず、2行に分けて書いている。(念のために)
NLS_LANGは、/usr/local/lib/php.iniで指定しているmbstring.internal_encodingの文字コードと同じに設定する。
Oracle DatabaseがEUCでも、WebサイトをUTF-8で運用している場合は、UTF-8でそろえる。
/usr/local/lib/php.ini
mbstring.internal_encoding = UTF-8
/usr/apache2/bin/envvars
NLS_LANG=Japanese_Japan.UTF8
設定後は、Apache2を確実に停止してから、起動することを忘れずに行う。
■Apache2実行ユーザにOracle実行権を与える
念のため、Apache2実行ユーザにOracle実行権を与えておいた。
Apache2の実行ユーザー webservd の情報を調べる。
# id -a webservd uid=80(webservd) gid=80(webservd) groups=80(webservd)
Apache2の実行ユーザー webservd にOracle実行グループを追加した。
# usermod -G webservd,dba webservd
■テスト
動作テスト用にinfo.phpを作成する。
<?php phpinfo() ?>
Oracleへの接続テスト test.php を作成する。
<html> <head> </head> <body> Oracle10g接続テスト <?php $connection = oci_connect('HR', 'PASS', 'ORCL'); $sql = 'select * from employees'; $statement = oci_parse($connection, $sql); oci_execute($statement); while($record = oci_fetch_array($statement)) { print $record['FIRST_NAME'] . "<br>¥n"; } oci_free_statement($statement); oci_close($connection); ?> </body> </html>
フィールドの指定は、first_nameではなく、FIRST_NAMEのように大文字で指定する。
たぶんフィールドを作ったときの指定なのかな…。
■ブラウザでアクセスする
ブラウザで、上記 test.php を実行したところ、
Warning: oci_connect() [function.oci-connect]: ORA-12154: TNS:could not resolve the connect identifier specified in /export/home/towns10/public_html/test.php
というエラーが発生した。
oracleユーザーでコマンドラインでtest.phpを実行して原因を探る。
$ php /export/home/towns10/public_html/test.php
次に、Oracleのサイトの指示通り、実行してみる。
Oracle Database、PHP、ApacheのLinuxへのインストール より
注意: Oracle Database 10.2を使用している場合は、Oracleディレクトリに対するアクセス権を「nobody」に設定する必要があります。Oracle 10.2.0.2の場合は、これを設定するスクリプト$ORACLE_HOME/install/changePerm.shがあります。
$ $ORACLE_HOME/install/changePerm.sh
それでも ORA-12154 エラーが発生する…。
メーリングリスト「Miracle LinuxとOracle10gR2とPHPで環境構築」を参考に
Apache の実行ユーザ webservd がアクセスできるように755へ変更する。
# chmod -R 755 /u01/app
相変わらず、エラーが表示される。
以下のページも参考に試してみた。
なんかメゲてきました。。。
Oracle Instant Client を使ってPHPをコンパイルを試そうかなぁ。。。
この記事読んだら、エラーは解消しない予感がする。
なんて、悩みながらイロイロ試しましたよ。
そして、ようやく解決!
■ORA-12154エラー対策
リスナーで、名前を解決できないようなので、tnsnames.oraと同様の内容をPHP内に記述した。
<html> <head> </head> <body> Oracle10g接続テスト <?php $db = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP) (HOST = 192.168.3.4)(PORT=1521))) (CONNECT_DATA=(SERVER=DEDICATED) (SERVICE_NAME=orcl)))"; $connection = oci_connect('HR', 'PASS', $db); $sql = 'select * from bdb_reagent'; $statement = oci_parse($connection, $sql); oci_execute($statement); while($record = oci_fetch_array($statement)) { print $record['FIRST_NAME'] . "<br>¥n"; } oci_free_statement($statement); oci_close($connection); ?> </body> </html>
Oracle PHP トラブルシューティング FAQ を地道に一個ずつチェックしてようやく解決しました。ありがとう〜!
■PHPのバージョンを隠す(オマケ作業)
wgetされたときにPHPのバージョン情報を与えないようにする。
httpd.confのお尻に一行追加する。
ServerTokens ProductOnly
-
前の記事
MySQL SQLコマンド一覧 2007.01.19
-
次の記事
OracleからテキストTAB、CSVデータでエクスポートする-1 2007.01.22