Solaris10 + Apache2 + PHP5.2 + Oracle10g

Solari10とApache2とPHP5.2.8とOracle10g 10.2.0.3.0 を組み合わせて使いたい。

Oracle10gが既にインストールされているSolaris10にPHP 5.2.8をインストールした作業の記録。

 

■インストール方法、参考情報

Oracle Database、PHP、ApacheのLinuxへのインストール

Oracle PHP Developer Center

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 PHP トラブルシューティング FAQ

OTN掲示板

Do You PHP?

 

なんかメゲてきました。。。

Oracle Instant Client を使ってPHPをコンパイルを試そうかなぁ。。。

この記事読んだら、エラーは解消しない予感がする。

OTN PHP5.2.5からOracle10gへの接続

 

なんて、悩みながらイロイロ試しましたよ。

そして、ようやく解決!

 

■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