<?
xml version="1.0" encoding="UTF-8"?>
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX This file is generated from xml source: DO NOT EDIT XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX <
title>モジュールの Apache 1.3 から Apache 2.0 への移植 - Apache HTTP サーバ</
title>
<
body id="manual-page"><
div id="page-header">
<
p class="apache">Apache HTTP サーバ バージョン 2.5</
p>
<
div class="up"><
a href="./"><
img title="<-" alt="<-" src="/images/left.gif" /></
a></
div>
<
p><
span>翻訳済み言語: </
span><
a href="/en/developer/modules.html" hreflang="en" rel="alternate" title="English"> en </
a> |
<
div class="outofdate">この日本語訳はすでに古くなっている
<
p>この文書は <
code>mod_mmap_static</
code> モジュールを Apache 2.0 用に移植した時に
学んだ経験をもとに書いた、最初の手引き書です。まだまだ完全じゃないし、
ひょっとすると間違っている部分もあるかもしれませんが、
<
div id="quickview"><
ul id="toc"><
li><
img alt="" src="/images/down.gif" /> <
a href="#easy">簡単な変更点</
a></
li>
<
li><
img alt="" src="/images/down.gif" /> <
a href="#messy">もっと厄介な変更点…</
a></
li>
<
div class="top"><
a href="#page-header"><
img alt="top" src="/images/up.gif" /></
a></
div>
<
h2><
a name="easy" id="easy">簡単な変更点</
a></
h2>
<
h3><
a name="cleanup" id="cleanup">クリーンナップ ルーチン</
a></
h3>
<
p>クリーンナップルーチンは <
code>apr_status_t</
code> 型である必要があります。
そして、apr_status_t 型の値を返さなくてはなりません。
クリーンナップ中のエラーを通知する必要がなければ、返り値は普通、
<
code>ARP_SUCCESS</
code> です。たとえエラーを通知したとしても、
エラーに応じた動作をするわけではないことに気をつけてください。</
p>
<
h3><
a name="init" id="init">初期化ルーチン</
a></
h3>
<
p>初期化ルーチンは処理全体から見てしっくりくるような意味を表すように、
名前が変更されました。ですから、<
code>mmap_init</
code> から <
code>mmap_post_config</
code>
渡される引数は大幅に変更され、次のようになりました。</
p>
<
li><
code>apr_pool_t *p</
code></
li>
<
li><
code>apr_pool_t *plog</
code></
li>
<
li><
code>apr_pool_t *ptemp</
code></
li>
<
li><
code>server_rec *s</
code></
li>
<
h3><
a name="datatypes" id="datatypes">データ型</
a></
h3>
施すべき変更点の簡単な一覧を以下に示します。</
p>
<
li><
code>pool</
code> becomes <
code>apr_pool_t</
code></
li>
<
li><
code>table</
code> becomes <
code>apr_table_t</
code></
li>
</
div><
div class="top"><
a href="#page-header"><
img alt="top" src="/images/up.gif" /></
a></
div>
<
h2><
a name="messy" id="messy">もっと厄介な変更点…</
a></
h2>
<
h3><
a name="register-hooks" id="register-hooks">フックの登録</
a></
h3>
<
p>新しいアーキテクチャでは作成した関数を呼び出すのに
一連のフックを使用します。このフックは、新しい関数
<
code>static void register_hooks(void)</
code> を使って登録するよう、
リクエストの処理のあるステージで呼び出さなくてはならない
関数は登録する必要があります。ハンドラは登録する必要はありません。
それぞれのフェーズで、関数を呼び出す相対的な順番は、
<
p>以下は、<
code>mod_mmap_static</
code> に追加したコードです:</
p>
<
div class="example"><
pre>
static void register_hooks(void)
static const char * const aszPre[]={ "
http_core.c",NULL };
ap_hook_post_config(mmap_post_config,NULL,NULL,HOOK_MIDDLE);
ap_hook_translate_name(mmap_static_xlat,aszPre,NULL,HOOK_LAST);
<
p>ここでは呼びだすべき二つの関数を登録しています。一つは
<
code>post_config</
code> ステージ用 (ほとんどすべてのモジュール
はこれが必要です) で、もう一つは <
code>translate_name</
code> フェーズ用です。
それぞれの関数は名前は違うけれども形式は同じであることに注意してください。
それでは、形式はどのようになっているでしょうか?</
p>
<
div class="example"><
p><
code>
ap_hook_<
var>phase_name</
var>(<
var>function_name</
var>,
<
var>predecessors</
var>, <
var>successors</
var>, <
var>position</
var>);
<
li><
code>HOOK_FIRST</
code></
li>
<
li><
code>HOOK_MIDDLE</
code></
li>
<
li><
code>HOOK_LAST</
code></
li>
<
p>位置を定義するには、上記の「位置」を指定し、
「先行」「後行」は、呼ばれるべき関数のリストです。
<
p><
code>mod_mmap_static</
code> の場合、<
code>post_config</
code>
<
code>mmap_static_xlat</
code> が core モジュールが名前の変換を実行した後に
<
strong>呼ばれなければなりません</
strong>。
そこで aszPre を使って <
code>HOOK_LAST</
code> の修飾子を定義しています。</
p>
<
h3><
a name="moddef" id="moddef">モジュールの定義</
a></
h3>
<
p>モジュールの定義を作成する際に注意しなければならない
ステージの数は激減しています。古い定義は次のようになっていました。</
p>
<
div class="example"><
pre>
module MODULE_VAR_EXPORT <
var>module_name</
var>_module =
/* dir merger --- default is to override */
/* merge server config */
/* filename translation */
<
p>新しい構造体はとってもシンプルです…</
p>
<
div class="example"><
pre>
module MODULE_VAR_EXPORT <
var>module_name</
var>_module =
/* create per-directory config structures */
/* merge per-directory config structures */
/* create per-server config structures */
/* merge per-server config structures */
<
p>このうちのいくつかは古いものから新しいものに直接読み替えられるもので、
いくつかはそうではありません。どうすればいいのかを要約してみます。</
p>
<
dt><
code>/* ディレクトリ設定作成関数 */</
code></
dt>
<
dd><
code>/* ディレクトリ毎設定構造体作成 */</
code></
dd>
<
dt><
code>/* サーバ設定作成関数 */</
code></
dt>
<
dd><
code>/* サーバ毎設定構造体作成 */</
code></
dd>
<
dt><
code>/* ディレクトリ設定マージ関数 */</
code></
dt>
<
dd><
code>/* ディレクトリ毎設定構造体マージ */</
code></
dd>
<
dt><
code>/* サーバ設定マージ関数 */</
code></
dt>
<
dd><
code>/* サーバ毎設定構造体作成マージ */</
code></
dd>
<
dt><
code>/* コマンド・テーブル */</
code></
dt>
<
dd><
code>/* コマンド apr_table_t */</
code></
dd>
<
dt><
code>/* ハンドラ */</
code></
dt>
<
dd><
code>/* ハンドラ */</
code></
dd>
<
p>古い関数の残りのものはフックとして登録されるべきです。
現時点で次のようなフック・ステージが定義されています…</
p>
<
dt><
code>ap_hook_post_config</
code></
dt>
<
dd>(以前の <
code>_init</
code> ルーチンが登録されるべき場所です)</
dd>
<
dt><
code>ap_hook_http_method</
code></
dt>
<
dd>(リクエストから HTTP メソッドを取得します (互換用))</
dd>
<
dt><
code>ap_hook_open_logs</
code></
dt>
<
dt><
code>ap_hook_auth_checker</
code></
dt>
<
dd>(リソースが権限を必要とするかどうかの確認)</
dd>
<
dt><
code>ap_hook_access_checker</
code></
dt>
<
dt><
code>ap_hook_check_user_id</
code></
dt>
<
dd>(ユーザ ID とパスワードの確認)</
dd>
<
dt><
code>ap_hook_default_port</
code></
dt>
<
dd>(サーバのデフォルト・ポートの取得)</
dd>
<
dt><
code>ap_hook_pre_connection</
code></
dt>
<
dd>(処理の直前に必要なことを実行。ただし accept 直後に呼ばれる)</
dd>
<
dt><
code>ap_hook_process_connection</
code></
dt>
<
dt><
code>ap_hook_child_init</
code></
dt>
<
dt><
code>ap_hook_create_request</
code></
dt>
<
dt><
code>ap_hook_fixups</
code></
dt>
<
dd>(応答内容の生成を変更するラスト・チャンス)</
dd>
<
dt><
code>ap_hook_handler</
code></
dt>
<
dt><
code>ap_hook_header_parser</
code></
dt>
<
dd>(モジュールにヘッダの照会をさせる。ほとんどのモジュールでは使われません。post_read_request を使います)</
dd>
<
dt><
code>ap_hook_insert_filter</
code></
dt>
<
dd>(フィルタ・チェインにフィルタを挿入)</
dd>
<
dt><
code>ap_hook_log_transaction</
code></
dt>
<
dd>(リクエストについての情報を記録する)</
dd>
<
dt><
code>ap_hook_optional_fn_retrieve</
code></
dt>
<
dd>(オプションとして登録された関数の取得)</
dd>
<
dt><
code>ap_hook_post_read_request</
code></
dt>
<
dd>(リクエストを読みこんだ後、他のフェーズの前に呼ばれる)</
dd>
<
dt><
code>ap_hook_quick_handler</
code></
dt>
<
dd>リクエストの処理が始まる前に呼ばれる。キャッシュモジュールが
<
dt><
code>ap_hook_translate_name</
code></
dt>
<
dd>(URI をファイル名に変換する)</
dd>
<
dt><
code>ap_hook_type_checker</
code></
dt>
<
dd>(文書型の決定と設定。あるいはその片方)</
dd>
<
p><
span>翻訳済み言語: </
span><
a href="/en/developer/modules.html" hreflang="en" rel="alternate" title="English"> en </
a> |
if (typeof(prettyPrint) !== undefined) {