|
晴れて2002年末にPHP4.3.0正式版がリリースされました。PHP4.2.x系と比べ、大幅な機能UP・バグ修正がなされています。また、日本PHPユーザー会の藤本さんが配布されていた通称「国際化版PHP4」と呼ばれていたパッチが本家のソースにマージされたことにより、本家から配布されているソースが実質的に「国際化版」になっています。が、これに伴い、追加・変更・削除されたオプション等がありますので、念のため、このインストールのページを作りました。
ここでは、国際化版ではないPHP4.2.x系とのインストール手順の違いを中心に、OCI関数をサポートしたPHP4.3.0をApache DSO(Dynamic Shared Object)としてのインストール手順を示します。基本的な手順はPHP4.2.x系と変わりませんが。。。
1.Apacheのインストール
Apacheのインストールのページを参照して、DSOをサポートするようインストールしてください。
2.Oracleのインストール
実際の手順は、Oracleのインストールガイドにお任せします(^^; インストールのポイントについては、「Oracle製品は何をインストールすればいい?」「Oracle製品は何をインストールすればいい? - Oracle9i編」にまとめてありますので、参照してみてください。
3.PHPのソースを入手・展開
PHP本家のサイト(http://www.php.net/)からソースを取得します。最新版は(2003/01/05現在)は、当然PHP4.3.0です。php-4.3.0.tar.bz2をダウンロード・展開後、php-4.3.0ディレクトリに移動します。GNU tarの場合、以下のコマンドです。
$ tar jxf php-4.3.0.tar.bz2
$ cd php-4.3.0/
4.PHPのconfigure
ここで、OCI関数サポートのオプションを付け、configureスクリプトを実行します。今回は、以下のオプションを付けましたが、その他のオプションはお好みにより付けて下さい。
- PHPをApache DSO版にする(*1)
- PHPでOCI8関数をサポートする(*2)
- マルチバイト文字列関数(mbstring)、マルチバイト正規表現関数(mbregex)をサポートする(*3)
-
Zendエンジンをマルチバイトサポートさせる(*4)
- デフォルトで組み込まれるMySQLサポートを外す(*5)
。。。と、今までと同じようですが、指定するオプションが若干変わっていて、「--enable-mbstr-enc-trans」オプションが廃止されました。その代わり、php.iniの「mbstring.encodingtranslation」で指定するようになりました。また、国際化版に含まれていた「--enable-zend-multibyte」オプションが追加されています。このオプションと、以下にあるphp.iniの設定を行うことで、PHPスクリプトをShift JISで記述できるようになります。
具体的なコマンドは、以下のようになります(カッコ内の数字は、上記のオプションの説明に対応しています)。
$ ./configure --with-apxs=/usr/local/apache/bin/apxs \ (*1)
--with-oci8=/u01/app/oracle/product/9.0.1 \ (*2)
--enable-sigchild \ (*2)
--enable-mbstring \ (*3)
--enable-mbregex \ (*3)
--enable-zend-multibyte \ (*4)
--without-mysql (*5)
拡張モジュールをshared extensionとしてインストールする場合は、こちらを参照してみてください
configureに失敗した場合、コンソールの最後にメッセージが表示されるので、確認してみましょう。また、ログファイルconfig.logが作成されているはずですので、こちらも確認してみましょう。このファイルには、configureスクリプトの何行目辺りにある、どういった処理を行っている時にエラーとなったかが記されています。
5.コンパイルとインストール
configureが無事終了したら、makeを実行しコンパイルを行います。コンパイルが終了したらrootユーザーとなり、インストールを実行します。
$ make
$ su
# make install
インストール先は、[Apacheのインストール先]/libexec となります。ここにlibphp4.soが存在するかどうか、確認しましょう(これが実体です)。
6.php.iniの設定
PHP4の設定ファイルであるphp.iniのコピー&設定を行います。php-4.3.0RC4ディレクトリにphp.ini-recommendedファイルがありますので、/usr/local/lib/php.iniとしてコピー&編集します。私の場合、以下のように修正しています(赤字の部分。先頭の数字は行番号)。
:
119 output_handler = mb_output_handler
:
282 display_errors = On
:
1014 mbstring.language = Japanese(アンコメント)
:
1019 mbstring.internal_encoding = EUC-JP(アンコメント)
:
1022 mbstring.http_input = auto(アンコメント)
:
1026 mbstring.http_output = SJIS(アンコメント)
:
1033 mbstring.encoding_translation = On(アンコメント&修正)
:
1037 mbstring.detect_order = auto(アンコメント)
:
1041 mbstring.substitute_character = none;(アンコメント)
:
1051 mbstring.func_overload = 0(アンコメント)
:
また、PHPスクリプトのエンコーディングにShift JISを使う可能性がある場合は、php.iniに以下の行を追加します。
:
mbstring.script_encoding = auto
:
7.httpd.confの設定
[Apacheのインストール先]/conf/httpd.confを編集し、PHPを使用可能な状態にします。以下の赤字が編集した部分です。
DirectoryIndex index.html index.php(必要であれば)
AddType application/x-httpd-php .php(アンコメント。必須)
AddType application/x-httpd-php-source .phps(必要であればアンコメント)
8.Apache起動・停止用スクリプトを作成する
Apacheを起動する際、Oracle関連の環境変数「ORACLE_HOME」「LD_LIBRARY_PATH」「PATH」 が必要になります。起動時に毎回設定するのも面倒なので、私は以下のような簡単なスクリプトを作成し、これで起動・停止を行っています(以下の例は、PHPスクリプトはEUC、OracleインスタンスはSJIS)。
#!/bin/sh
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/9.0.1
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export ORACLE_SID=orcl
export NLS_LANG=Japanese_Japan.JA16EUC
export PATH=$PATH:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
/usr/local/apache/bin/apachectl $1
Oracleとの連携を行う場合、
「mbstring.internal_encodingの文字コード = NLS_LANGの文字コード」
と指定することで、PHPスクリプトとDBから取得した文字での文字化けを防ぐことができます。mbstring.internal_encodingとPHPスクリプトの文字コードが異なる場合、mbstring.script_encodingを使用する必要があります。
これを/usr/sbin/apachectlとして保存しておき、実行権限を与えておきます。
# chmod u+x /usr/sbin/apachectl
環境変数を変更した場合は、一度停止させて起動する必要があります(restartオプションではダメです)
9.Apacheの起動と動作確認
スクリプトを使ってApacheを起動します。
$ su -
# /usr/sbin/apachectl start
以下のようなPHPスクリプトを用意し、Oracleとの接続テストを行います。
<?php
<b>●Oracleとの接続テスト</b>
<hr>
<?php
$conn = OCILogon("scott", "tiger", "orcl");
$stmt = OCIParse($conn,"select * from emp ");
OCIExecute($stmt);
$ncols = OCINumCols($stmt);
echo "<TABLE BORDER='1'>";
echo "<TR>";
for ( $i = 1; $i <= $ncols; $i++ ) {
$column_name = OCIColumnName($stmt,$i);
echo "<TH>" . $column_name . "</TH>";
}
echo "</TR>";
while(OCIFetch($stmt))
{
echo "<TR>";
for ( $i = 1; $i <= $ncols; $i++ ) {
$column_name = OCIColumnName($stmt,$i);
echo "<TD>" . OCIResult($stmt, $column_name) . "</TD>";
}
echo "</TR>";
}
echo "</TABLE>";
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
ブラウザからアクセスしてみて、以下のようにテーブルの内容が表示されればOKです。
|