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



last updated
2003/01/06

counter hits
since 1999/11/06


拡張モジュールをshared extensionとしてインストールする

2002/12/20付けでリリースされたPHP4.3.0RC4を使って、oci8やdomxmlなどの拡張モジュールをWin版と同じくphp.iniの「extension」で追加・削除できる(shared extension)ようにインストールする手順を示します。

memo[2003/01/06] PHP4.2.xとPHP4.3.0のインストール手順の違いを、PHP4.3.0+Oracleのインストール(DSO版)にまとめています。

shared extensionの利点ですが、当然の事ながら「動的に機能を追加・削除できる」点でしょう。php.iniの修正だけではなく、PHPスクリプト中でdl関数を私用することにより、特定のスクリプトのみ「とある拡張モジュール」を使うことができるようになります。

もっと具体的なイメージ(PHP.4.0.xから使っていた人は分かりますが)は、PHP本体に組み込まれる前のmbstring、mbregexです。

1.Apacheのインストール

Apacheのインストールのページを参照して、DSOをサポートするようインストールしてください。

2.PHPのソースを入手・展開

PHP本家のサイト(http://www.php.net/)からソースを取得します。今回はPHP4.3.0RC4を使いました。php-4.3.0RC4.tar.gzをダウンロード・展開後、php-4.3.0RC4ディレクトリに移動します。GNU tarの場合、以下のコマンドです。

$ tar zxf php-4.3.0RC4.tar.gz
$ cd php-4.3.0RC4/

3.PHPのconfigure

「./configure --help」をしてみれば分かることなんですが、extensionを指定する「--with-xxx=...」で

--with-oci8=shared,/u01/app/oracle/...

という風に「shared」を付けるだけでshared extensionとしてコンパイルされます。ただし、全てのextensionがshared extensionとしてコンパイルできるわけではないようです。
今回は、以下のオプションを付けましたが、その他のオプションはお好みにより付けて下さい。

  • PHPをApache DSO版にする(*1)
  • PHPでOCI8関数をサポートし、shared extensionとしてコンパイルする(*2)
  • マルチバイト文字列関数(mbstring)、マルチバイト正規表現関数(mbregex)をサポートする(*3)
  • Zendマルチバイトをサポートする(*4)
  • DOMXMLをサポートし、shared extensionとしてコンパイルする(*5)
  • デフォルトで組み込まれるMySQLサポートを外す(*6)

具体的なコマンドは、以下のようになります(カッコ内の数字は、上記のオプションの説明に対応しています)。

$ ./configure --with-apxs=/usr/local/apache/bin/apxs \  (*1)
--with-oci8=shared,/u01/app/oracle/product/8.1.6 \  (*2)
--enable-sigchild \  (*2)
--enable-mbstring \  (*3)
--enable-mbregex \  (*3)
--enable-zend-multibyte \  (*4)
--enable-dom=shared \  (*5)
--without-mysql  (*6)

cautionconfigureに失敗した場合、コンソールの最後にメッセージが表示されるので、確認してみましょう。また、ログファイルconfig.logが作成されているはずですので、こちらも確認してみましょう。このファイルには、configureスクリプトの何行目辺りにある、どういった処理を行っている時にエラーとなったかが記されています。

4.コンパイルとインストール

configureが無事終了したら、makeを実行しコンパイルを行います。コンパイルが終了したらrootユーザーとなり、インストールを実行します。

$ make
$ su
# make install

memoインストール先は、[Apacheのインストール先]/libexec となります。ここにlibphp4.soが存在するかどうか、確認しましょう(これが実体です)。

5.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
                :
    438 extension_dir = /usr/local/lib/php/extensions/no-debug-non-zts-20020429/
                :
   1015 mbstring.language = Japanese(アンコメント)
                :
   1020 mbstring.internal_encoding = EUC-JP(アンコメント)
                :
   1023 mbstring.http_input = auto(アンコメント)
                :
   1027 mbstring.http_output = SJIS(アンコメント)
                :
   1034 mbstring.encoding_translation = On(アンコメント&修正)
                :
   1038 mbstring.detect_order = auto(アンコメント)
                :
   1042 mbstring.substitute_character = none;(アンコメント)
                :
   1052 mbstring.func_overload = 0(アンコメント)
                :

ここでは、php.iniから直接shared extensionがインストールされたディレクトリを指定していますが、mbregexの時に書いたようにシンボリックリンクでもOKです。この場合、extension_dirの設定は、

                :
    438 extension_dir = /usr/local/lib/php/extensions/

になります。

memoconfigure時に「--enable-debug」を指定した場合、shared extensionのインストール先は、/usr/local/lib/php/extensions/debug-non-zts-20020429/(no-debug-...ではない)になります。

cautionconfigure時に「--enable-zend-multibyte」を指定した場合、PHPスクリプトをShift_JISで記述することができます。その場合、php.iniに「mbstring.script_encoding = Shift_JIS」を追加してください。

6.httpd.confの設定とApacheの起動

こちらを参考にしてください(^-^;

7.動作確認

以下のようなPHPスクリプトを用意し、動作を確認します。以下の例は、oci8拡張モジュールのテストスクリプトですので、他の拡張モジュールの場合は別途用意してください(^-^;

まずは、php.iniから直接extensionで指定する場合のサンプルですが、PHP本体に組み込んだ場合と同じです。


<?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);
?>

PHPスクリプトでロードする場合、当該関数を使用する前にdl関数を使って拡張モジュールをロードします。

●dl関数の使用例(上記スクリプトからの差分)

<?php
:
<?php
    // 拡張モジュールのロード
    dl("oci8.so");

    // Oracleとの接続
    $conn = OCILogon("scott", "tiger", "orcl");
                      :
?>



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