- 2006-04-15
- php
PHP で Web アプリケーションを書くときは、CGI として動かすこともできるが、たいていは apache のモジュールとして動かしていると思う。 このモジュールというのは mod_php4 とか mod_php5 とかいうやつ。 で、これに相当するものとして、Perl には mod_perl、ruby や Python にも mod_ruby や mod_python がある。
これらのモジュールは、apache がリクエストを処理する過程の色んなタイミングで、apache から呼び出されるわけなんだけど、 実は mod_php とその他の mod_perl には大きな違いがあるわけだ。
コードを見るのが早いだろう。以下は apache から呼び出されるタイミングの定義みたいなもん。
mod_perl の src/modules/perl/mod_perl.c
module MODULE_VAR_EXPORT perl_module = {
STANDARD_MODULE_STUFF,
perl_module_init, /* initializer */
perl_create_dir_config, /* create per-directory config structure */
perl_merge_dir_config, /* merge per-directory config structures */
perl_create_server_config, /* create per-server config structure */
perl_merge_server_config, /* merge per-server config structures */
perl_cmds, /* command table */
perl_handlers, /* handlers */
PERL_TRANS_HOOK, /* translate_handler */
PERL_AUTHEN_HOOK, /* check_user_id */
PERL_AUTHZ_HOOK, /* check auth */
PERL_ACCESS_HOOK, /* check access */
PERL_TYPE_HOOK, /* type_checker */
PERL_FIXUP_HOOK, /* pre-run fixups */
PERL_LOG_HOOK, /* logger */
...
(`・ω・´) シャキーン
php-5.1.2 の sapi/apache/mod_php5.c
module MODULE_VAR_EXPORT php5_module =
{
STANDARD_MODULE_STUFF,
php_init_handler, /* initializer */
php_create_dir, /* per-directory config creator */
php_merge_dir, /* dir merger */
NULL, /* per-server config creator */
NULL, /* merge server config */
php_commands, /* command table */
php_handlers, /* handlers */
NULL, /* filename translation */
NULL, /* check_user_id */
NULL, /* check auth */
NULL, /* check access */
NULL, /* type_checker */
NULL, /* fixups */
NULL /* logger */
...
(´・ω・`) ショボーン
という感じ。つまり大雑把にいうと、mod_perl なんかの方がいろんな方法で apache と連携できるわけだ。
という話を書こうと思ったら、php のソース内に sapi/apache_hooks/ というディレクトリがあるのを発見してしまった。
php-5.1.2 の sapi/apache_hooks/mod_php5.c
module MODULE_VAR_EXPORT php5_module =
{
STANDARD_MODULE_STUFF,
php_init_handler, /* initializer */
php_create_dir, /* per-directory config creator */
php_merge_dir, /* dir merger */
php_create_server, /* per-server config creator */
NULL, /* merge server config */
php_commands, /* command table */
php_handlers, /* handlers */
php_uri_translation, /* filename translation */
NULL, /* check_user_id */
php_auth_hook, /* check auth */
php_access_hook, /* check access */
php_type_hook, /* type_checker */
php_fixup_hook, /* fixups */
php_logger_hook /* logger */
...
おお、何ですかこれは。どうやら ./configure --with-apache のかわりに --with-apache-hooks とするらしいよ。 README にもなかなか素敵なことが書いてある。
phpRequire /tmp/setup.php
<Location /hello>
AddHandler php-script
phpResponseHandlerMethod Hello::World
</Location>
with
#/tmp/setup.php
<?
class Hello {
function World() {
global $request;
$request->send_http_header();
echo "Hello World";
}
}
?>
他にも色々素敵なことが書いてあったので、codeblog の gonzui へのリンクを貼っておこう。 これの何が素敵なのかわからん人にはさっぱりワカランと思うけど、 まー apache モジュールに関しては小山さんの本とか、あと mod_python のドキュメントが実は良いと思う。
この PHP の素敵な機能、apache_hooks の欠点は、
- make install してもインストールされない
- README のように httpd.conf を設定すると、構文エラーになる。
- せぐめんてーしょんふぉるとになる
これらの欠点を除けば、なかなか素晴しい機能かもしれない。 かもしれないというのは、まだ動かせてないからわからないという意味です。
続くかも。