Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2006/09/25

counter hits
since 1999/11/06


Win32版Apache2+Win32版PHP5.1.4のOracleサポート手順(DSO版)

alertここにある情報はかなり古くなっており、正しくなくなっている可能性があります。掲載しているサンプルコード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の

  • basic
  • sqlplus

をダウンロードしました。いずれも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のパスが含まれているかどうか確認してください。

phpinfo

エラーなしで起動した場合は、以下のようなPHPスクリプトを用意し、Oracleとの接続テストを行います。

●oci8.php
  
<b>●Oracleとの接続テスト</b>
<hr>
<?php
    // Oracleとの接続
    $conn = OCILogon("scott", "tiger", "orcl");

    // SQL文のparse
    $stmt = OCIParse($conn,"select * from emp ");

    // SQL文の実行
    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>";

    // データのFetch
    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);

    // Oracleから切断
    OCILogoff($conn);
?>

ブラウザからアクセスしてみて、以下のようにテーブルの内容が表示されればOKです。

Apacheの起動確認

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 = $db->prepare("SELECT * FROM emp WHERE empno = ? ");
    //$param = 7499;
    //$stmt->bindParam(1, $param);
    $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;
?>



About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2006 by Hideyuki SHIMOOKA all rights reserved.