## 拡張モジュールのライフサイクル

PHP の拡張モジュールは、そのライフサイクルにおいていくつかの段階をたどります。 これらの段階を通じて、開発者はさまざまな初期化や後処理そして情報の取得などを行います。 Zend API には、拡張モジュールの 5 つの段階のそれぞれに対するフックがあります。 これらは PHP の関数からコールされるのとは別のものです。

### ロード、アンロードそしてリクエスト

Zend エンジンは、クライアントからのひとつあるいは複数の "リクエスト" を処理します。昔ながらの CGI の実装では、 このリクエストごとにひとつのプロセスを実行します。 しかし、それ以外の多くの実装 (有名どころでは Apache モジュールなど) では、複数のリクエストを単一の PHP プロセスに関連付けることができます。 したがって、PHP の拡張モジュールはその生存期間中に多くのリクエストを処理することもありえます。

### 概要

- Zend API では、モジュールがメモリにロードされるのは対応する PHP プロセスが立ち上がる際だけです。 各モジュールは、`zend_module` 構造体で定義された "モジュール初期化" 関数をロード時に実行します。
- 対応する PHP プロセスがクライアントからのリクエストの処理を開始する (つまり、PHP インタプリタが動き始める) ときには、 各モジュールは `zend_module` 構造体で定義された "リクエスト初期化" 関数を実行します。
- 対応する PHP プロセスがリクエストの処理を終了したときには、 各モジュールは `zend_module` 構造体で定義された "リクエスト後処理" 関数を実行します。
- 対応する PHP プロセスが終了する際に、 モジュールも順にメモリからアンロードされます。そのときには、 各モジュールは `zend_module` 構造体で定義された "モジュール後処理" 関数を実行します。

### 何をどこでするのか

これら 4 つのポイントでは、多くの作業が行われます。 この表では、一般的な初期化と後処理がどこで行われるのかをまとめます。

何をどこでするのか
モジュールの初期化/後処理 | リクエストの初期化/後処理
--- | ---
モジュールグローバル変数の割り当て/解除と初期化 | リクエスト固有の変数の割り当て/解除と初期化
クラスエントリの登録/解除 |
INI エントリの登録/解除 |
定数の登録 |

### phpinfo() コールバック

グローバルの初期化や実際に使われるコールバックとは別に、 モジュールのライフサイクルにかかわるものがもうひとつあります。 phpinfo() のコールです。 ユーザーがこれをコールした際の出力には、 コールした時点で PHP インタプリタに読み込まれている各拡張モジュールからの出力が含まれます。 結果が HTML であるかそれ以外であるかにはかかわりません。

各フォーマットに依存しない出力を得るために、ヘッダファイル "ext/standard/info.h" に関数の配列が含まれており、 これらを用いて標準化された表示要素を生成します。 特に、以下のいくつかの関数で、おなじみの表を作成します。

php_info_print_table_start()
  phpinfo() 出力用のテーブルを開きます。 パラメータは受け取りません。
php_info_print_table_header()
  phpinfo() 出力用のテーブルヘッダを表示します。 1 つのパラメータとしてカラム数を受け取り、それと同じ数の char * パラメータで各カラムヘッダのテキストを受け取ります。
php_info_print_table_row()
  phpinfo() 出力用のテーブルの行を表示します。 1 つのパラメータとしてカラム数を受け取り、それと同じ数の char * パラメータで各カラムのテキストを受け取ります。 content.
php_info_print_table_end()
  事前に php_info_print_table_start() で開いたテーブルを閉じます。 パラメータは受け取りません。

これら 4 つの関数を使用すると、拡張モジュールのほぼすべての機能の情報を出力することができます。 これは、counter 拡張モジュールの情報出力用コールバックです。

例1 counter の PHP_MINFO 関数

    /* {{{ PHP_MINFO(counter) */
    PHP_MINFO_FUNCTION(counter)
    {
        char        buf[10];

        php_info_print_table_start();
        php_info_print_table_row(2, "counter support", "enabled");
        snprintf(buf, sizeof(buf), "%ld", COUNTER_G(basic_counter_value));
        php_info_print_table_row(2, "Basic counter value", buf);
        php_info_print_table_end();
    }
    /* }}} */