|
ここにある情報はかなり古くなっており、正しくなくなっている可能性があります。掲載しているサンプルコードiなどは、最新のPHPでは動作しない、もしくは、別途設定・調整が必要になるかも知れません。情報を鵜呑みにせず、あなたの手を動かして、あなたの目で確認してください。
OracleをサポートしたPHPをApache DSO(Dynamic Shared Object)としてインストールする手順を示します。
1.今回の環境
PHP5.1.2以降、Win32版は、Oracle Instant Clientを使ってbuildされるようになったようです。この関係で、Oracle8とOracle9のClientでは動作せず、Oracle10gもしくはOracle Instant Clientであれば動作するとのことです。ページの下の方にあるtony2001氏の投稿を見てみてください。
ということで、今回はOracle Instant Clientを使っています。
- Windows2000 Professional
- Apache2.0.58 for Win32
- PHP5.1.4 for Win32
- Oracle Instant Client 10.2.0.1.0
2.Apacheのインストール
Apacheプロジェクトのダウンロードページからダウンロードします。今回は、Apache2のMSI Installer版をダウンロードしました。ダウンロード後msiファイルを実行し、ウィザードに従ってインストールします。今回はデフォルトのままC:\Program Files\Apache Group\Apache2にインストールしました。
3.Oracle Instant Clientのインストール
OTNのダウンロードページからOracle Instant Clientをダウンロードします。なお、ユーザー登録が必要になります。今回は、バージョン10.2.0.1.0の
をダウンロードしました。いずれもzip形式です。ちなみに、sqlplusは接続確認用のために使いました。
ダウンロードしたファイルをスペースを含まないディレクトリに展開します。今回は、c:\instantclient_10_2としました。また、このディレクトリをシステム環境変数の方のPATHに追加します。
この時、すでにOracle Client(8 or 9)がインストールされている場合、それよりも前になるように設定します。今回は、すでにOracle 8iのクライアントがインストールされていたので、
PATH=c:\instantclient_10_2;...
のように先頭に記述しました。
もう一つ、NLS_LANGもシステム環境変数として追加します。
NLS_LANG=japanese_japan.ja16sjis
なお、追加した後、環境変数を間違いなく反映させるためにOSを再起動しておいた方が無難です。
4.PHPのインストール
PHP本家からWin32用バイナリを取得します。今回はPHP5.1.4のzip版を取得しました。取得後、任意のディレクトリに展開します。今回は「c:\php」としましたので、以下の説明は適宜読み替えてください。展開後、c:\php\php5ts.dllを%windir%、あるいは%windir%\system32にコピーします。
5.Apacheの設定
Apacheをインストールしたディレクトリ直下のconfディレクトリにhttpd.confがあるので、環境に合わせて編集します。
# host 名
ServerName [host名]
# URLでファイルが指定されなかった場合に表示するファイル名
DirectoryIndex index.html index.php
# 以下、追加分
LoadModule php5_module "c:/php/php5apache2.dll"
AddType application/x-httpd-php .php
PHPIniDir "c:/php"
6.php.iniの設定
PHPを展開したディレクトリにphp.ini-recommendedファイルがありますので、同じディレクトリにphp.iniとしてコピーします。もし、先のhttpd.confの「phpIniDir」ディレクティブがPHPを展開したディレクトリでない場合、そのディレクトリにコピーしてください。コピーしたら、以下の内容を追記します。詳細はPHPマニュアルなどを参照して下さい。
output_buffering = 4096
output_handler = mb_output_handler
display_errors = On
extension_dir="c:/php/ext/"
extension=php_mbstring.dll
mbstring.language = Japanese
mbstring.internal_encoding = sjis-win
mbstring.http_input = sjis-win
mbstring.http_output = sjis-win
mbstring.encoding_translation = On
mbstring.detect_order = sjis-win
mbstring.substitute_character = none;
mbstring.func_overload = 0
extension=php_pdo.dll
extension=php_pdo_oci.dll
extension=php_pdo_oci8.dll
extension=php_oci8.dll
7.Apacheの起動と動作確認
Apache MonitorもしくはDOSプロンプトからApacheを起動します。DOSプロンプトからの場合、以下のような感じです。
> cd [Apacheをインストールしたディレクトリ]\bin
> apache
Oracle10gもしくはOracle Instant Clientを使わない場合、「エントリポイントが見つかりません」
といったダイアログ、もしくは、error_logに「指定されたプロシージャが見つかりません」といったログが出力されます。
●error_log
PHP Warning: PHP Startup: Unable to load dynamic library
'C:/PHP/ext/php_oci8.dll' -
\x8ew\x92\xe8\x82\xb3\x82\xea\x82\xbd\x83v\x83\x8d\x83V\x81
[\x83W\x83\x83\x82\xaa\x8c\xa9\x82\xc2\x82\xa9\x82\xe8\x82\xdc\x82\xb9\x82\xf1\x81B\r\n
in Unknown on line 0
Oracle Instant Clientを使っていてエラーが発生する場合、phpinfoの「Environment」にある「Path」に、追加したOracle Instant Clientのパスが含まれているかどうか確認してください。
エラーなしで起動した場合は、以下のようなPHPスクリプトを用意し、Oracleとの接続テストを行います。
●oci8.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です。
PDOの場合、次のようなコードで動作を確認してみてください。
●pdo_oci.php
<?php
$db = new PDO("oci:dbname=//dbserver:1521/orcl", "scott", "tiger");
$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$stmt = $db->prepare("SELECT * FROM emp ");
$stmt->execute();
$cnt = 1;
$row = array();
echo '<table border="1">';
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo '<tr>';
echo '<th>' . $cnt++ . '</th>';
foreach ($row as $column_name => $column_value) {
echo '<td>' . $column_value . '</td>';
}
echo '</tr>';
}
echo '</table>';
$stmt = null;
?>
|