Solaris10 + Apache1.3 + PHP5.2 + Oracle10g

 既にApache1.3 + Oracle10gが稼働しているSolaris10上で、PHP5.2.9をインストールして、OracleデータベースをPHPから利用できるようにする。

 

■PHP5のインストール

Oracleのバイナリへアクセスする必要があるので、Oracle実行ユーザかrootで行う。

configure前に、環境変数をエクスポートしておく。

# ORACLE_HOME=/u01/app/orcl/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
# PATH=/usr/sfw/bin:$PATH; export PATH
# TZ=Japan

 

念のため、ライブラリもエクスポートしておいた。

# LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib:/usr/local/lib:/usr/sfw/lib
# LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/dt/lib:/usr/openwin/lib
# LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/xpg4/lib:/lib:/usr/ccs/lib
# export LD_LIBRARY_PATH

 

configureを実行する。

./configure  --with-mysql=/usr/sfw \
--with-apxs=/usr/local/apache/bin/apxs \
--with-gd --with-zlib \
--enable-mbstring \
--enable-mbregex \
--enable-zend-multibyte \
--enable-sqlite-utf8 \
--with-oci8=shared,/u01/app/orcl/product/10.2.0 --enable-sigchild \
--with-pdo-oci=/u01/app/orcl/product/10.2.0

 

エラー発生

make: *** [main/reentrancy.lo] Error 1
make: *** [libphp5.la] Error

 

解決

/usr/local/lib/libz.a まわりでエラーが発生するので、リネームして使わないようにしておく。
/usr/local/lib/libz.aのかわりにSolaris付属の/usr/lib/libz.soを使うようにする。

# cd /usr/local/lib
# mv libz.a _libz.a

ちなみにzlibのインストール時に--sharedオプションを追加して./configureしてあげると、libz.aは生成されないで、libz.soが生成される。

 

エラー発生-2

collect2: ld returned 1 exit status
make: *** [sapi/cli/php] Error 1

 

解決-2

ソースを削除して、再度tar zxvf php-*.tgzで解凍して、configureをやり直す。

 

 

 

■php.iniを用意する

インストールが終わったら引き続き、php.iniを設置する。

php.iniの設置場所を確認する。

# /usr/local/bin/php -i | grep php.ini
Configuration File (php.ini) Path => /usr/local/lib

 

php.ini-dist または php.ini-recommendedを/usr/local/libにphp.iniとファイル名を変更してコピーする。(2つのファイルの違いはdiffコマンドで確認) 

# cp php.ini-dist /usr/local/lib/php.ini 

 

Apacheを再起動ではなく、停止、起動してPHPを有効にする。

 

 

■Apache1.3の起動スクリプトへの追加

/etc/init.d/apache起動スクリプトの最初に環境変数の設定を加える。

#!/bin/sh
ORACLE_HOME=/u01/app/orcl/product/10.2.0
export ORACLE_HOME
ORACLE_SID=orcl
export ORACLE_SID

#NLS_LANG=Japanese_Japan.JA16EUC
#NLS_LANG=Japanese_Japan.JA16SJIS
NLS_LANG=Japanese_Japan.UTF8
export NLS_LANG

TNS_ADMIN=$ORACLE_HOME/network/admin
export TNS_ADMIN

LD_LIBRARY_PATH=/usr/openwin/lib:$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH

PATH=$ORACLE_HOME/bin:$PATH
export PATH

...Apacheの起動スクリプトが続く。

 

OracleデータベースがEUCでも、WebサイトでUTF-8を使うので、NLS_LANGはUTF-8を指定する。php.iniのmbstring.internal_encodingも同じUTF-8を指定して合わせる。

 

 設定変更後は、Apacheを再起動ではなく、必ず停止してから起動する。

 

■Apache1.3実行ユーザにOracle実行権を与える

念のため、Apache1.3実行ユーザにOracle実行権を与えておいた。

Apache1.3の実行ユーザー apache の情報を調べる。

# id -a apache
uid=555810(apache) gid=3002(apache) groups=3002(apache)

 

Apache1.3の実行ユーザー apache にOracle実行グループ dba を追加した。

# usermod -G apache,dba apache

 

 

■php.iniに設定を追加、修正する

 /usr/local/lib/php.ini

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;

extension=oci8.so
extension=pdo_oci.so


;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;

extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20060613/"


;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;

[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = pass
;mbstring.encoding_translation = Off
mbstring.detect_order = auto
mbstring.substitute_character = none
;mbstring.func_overload = 0


 

 

■その他

OracleのバイナリへApache実行ユーザである apache がアクセスできるようにディレクトリが755になっているかを確認する。

 

 

■PHPでテストする

test.php

<html>
<head>
<title></title>
</head>
<body>
<pre>
<?php
putenv("TZ=Japan");
echo date("Y/m/d H:i:s (D)", time());

$db = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)
(HOST = 192.168.2.3)(PORT=1521)))
(CONNECT_DATA=(SERVER=DEDICATED)
(SERVICE_NAME=orcl)))";

$con = oci_connect( 'username', 'password', $db );

if (! $con) {
echo 'ERROR!!';
$exp = oci_error();
echo htmlentities( $exp['message'] );
}

$sql = 'select last_name from EMP';
$state = oci_parse( $con, $sql );
oci_execute( $state );
while ( oci_fetch( $state ) ) {
echo oci_result( $state, 'LAST_NAME' ), "\n";
}
oci_free_statement( $state );
oci_close( $con );
?>
</pre>
</body>
</html>