|
ここにある情報はかなり古くなっており、正しくなくなっている可能性があります。掲載しているサンプルコードiなどは、最新のPHPでは動作しない、もしくは、別途設定・調整が必要になるかも知れません。情報を鵜呑みにせず、あなたの手を動かして、あなたの目で確認してください。
2002/09/06付でPHP 4.2.3がリリースされました(藤本さんによるChangeLogの和訳)が、HTMLフォームから配列データを正しく取得できないというバグがあります。使用する場合は、PHP-usersに流れたパッチを適用して下さい。
PHP-usersでも頻出していますが、PHP4.2.0から外部変数(環境変数、HTTP リクエスト、クッキー、ウェブサーバの情報)は、もはやデフォルトではグローバルスコープではありません(php.iniのregister_globalsがOff)。つまり、GET、POSTされたデータを「$xxxx」の形で受け取ることは、デフォルトではできません。この場合、PHP4.1.0から導入されたスーパーグローバル変数($_GET、$_POSTなど)を使用することが推奨されています。詳細は、PHPユーザー会のページをどうぞ
OracleをサポートしたPHPをApache DSO(Dynamic Shared Object)としてのインストール手順を示します。基本的な手順はPHP3.0.xと変わりませんが、念のため。。。
なお、php.iniには従来php.ini-distを使用していましたが、php.ini-recommendedを使用するようにしています。
1.Apacheのインストール
Apacheのインストールのページを参照して、DSOをサポートするようインストールしてください。
2.Oracleのインストール
実際の手順は、Oracleのインストールガイドにお任せします(^^; インストールのポイントについては、「Oracle製品は何をインストールすればいい?」「Oracle製品は何をインストールすればいい? - Oracle9i編」にまとめてありますので、参照してみてください。
3.PHPのソースを入手・展開
PHP本家のサイト(http://www.php.net/)からソースを取得します。最新版は(2002/10/08現在)は、PHP4.2.3ですが、HTMLフォームから配列データを正しく取得できないというバグがありますので、PHP.4.2.2を使いました。php-4.2.2.tar.gzをダウンロード・展開後、php-4.2.2ディレクトリに移動します。GNU tarの場合、以下のコマンドです。
$ tar zxf php-4.2.2.tar.gz
$ cd php-4.2.2/
4.PHPのconfigure
ここで、Oracleサポートのオプションを付け、configureスクリプトを実行します。今回は、以下のオプションを付けましたが、その他のオプションはお好みにより付けて下さい。
- PHPをApache DSO版にする(*1)
- PHPでOCI8関数をサポートする(*2)
- マルチバイト文字列関数(mbstring)、マルチバイト正規表現関数(mbregex)をサポートする(*3)
- デフォルトで組み込まれるMySQLサポートを外す(*4)
具体的なコマンドは、以下のようになります(カッコ内の数字は、上記のオプションの説明に対応しています)。
$ ./configure --with-apxs=/usr/local/apache/bin/apxs \ (*1)
--with-oci8=/u01/app/oracle/product/8.1.6 \ (*2)
--enable-sigchild \ (*2)
--enable-mbstring \ (*3)
--enable-mbstr-enc-trans \ (*3)
--enable-mbregex \ (*3)
--without-mysql (*4)
Oracle関数をサポートする場合は、「--with-oracle=[ORACLE_HOMEのパス]」を指定します
configure --help とすると、オプションの説明が表示されます。
PHP3/4を同居させるためには、PHP3、PHP4のconfigure時に「--enable-versioning」オプションを付け、それぞれmake・make installします。
configureに失敗した場合、コンソールの最後にメッセージが表示されるので、確認してみましょう。また、ログファイルconfig.logが作成されているはずですので、こちらも確認してみましょう。このファイルには、configureスクリプトの何行目辺りにある、どういった処理を行っている時にエラーとなったかが記されています。
5.コンパイルとインストール
configureが無事終了したら、makeを実行しコンパイルを行います。コンパイルが終了したらrootユーザーとなり、インストールを実行します。
$ make
$ su
# make install
インストール先は、[Apacheのインストール先]/libexec となります。ここにlibphp4.soが存在するかどうか、確認しましょう(これが実体です)。
6.php.iniの設定
PHP4の設定ファイルであるphp.iniのコピー&設定を行います。php-4.2.2ディレクトリにphp.ini-recommendedファイルがありますので、/usr/local/lib/php.iniとしてコピー&編集します。私の場合、以下のように修正しています(赤字の部分。先頭の数字は行番号)。
:
108 output_handler = mb_output_handler
:
253 display_errors = On
:
866 mbstring.internal_encoding = EUC-JP(アンコメント)
867 mbstring.http_input = auto(アンコメント)
868 mbstring.http_output = SJIS(アンコメント)
869 mbstring.detect_order = auto(アンコメント)
870 mbstring.substitute_character = none;(アンコメント)
:
[2002/10/13] 以前「allow_call_time_pass_reference = On」も追加していましたが、個人的にオブジェクトやリソースの参照渡しが必要だったために「On」にしていました。「今後のバージョンで廃止されそうな雰囲気」のようですので、基本は「Off」でプログラミングした方が良いです。PHP-usersにも情報があります。
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/8.1.6
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との連携を行う場合、
「PHPスクリプトの文字コード = mbstring.internal_encodingの文字コード = NLS_LANGの文字コード」
と指定することで、PHPスクリプトとDBから取得した文字での文字化けを防ぐことができます。これは、PHP3国際化版と異なりソースコードの自動認識をしないためです。また、mbstring.internal_encodingは基本的にOSのデフォルトの文字コードにしないと「表」などのshift_jisで「0xC5」が含まれる文字で文字化けする可能性があります。
これを/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です。
|