[PHP-users 21114]Re: ユーザの行動追跡のヒント(PHP変数の値をApache のログに書きこめるか?)

SAWADA Hodaka hoda @ tail.gr.jp
2004年 4月 2日 (金) 15:01:35 JST


調べものをしていて、たしか見たはずなんだけど、
google に引っ掛からなかったので、保守あげという意味も含めて投稿します。

mailman の過去ログは月をまたぐとスレッドをぶら下げてくれないので、
google では見つけられなかったようです。

結局、local の MH folder を grep して見つけてしまいました。

以下全文引用ごめんなさい。

At Thu, 24 Apr 2003 23:46:32 +0900,
Y.Watanabe wrote:
> 
> ども、わたなべです。
> 
> "Y.Watanabe" wrote on 2002/06/24 17:51
> with Subject: [PHP-users 8250] PHP変数の値をApache のログに書きこめるか?
> http://ns1.php.gr.jp/pipermail/php-users/2002-June/008255.html
> 
> > 例えば下記のようにPHPの変数にユーザー名等の情報が入っているとして、
> > 
> > $_SESSION["username"] = "watanabe"
> > 
> > この変数の情報を、Apacheが自分のアクセスログファイルに
> > 記録するように仕向けられないでしょうか?
> > 
> > ちょうど、ApacheがHTTP基本認証でのユーザー名をログファイルに
> > 記録できるのと同様のことをなんとかできないかなと思っております。
> 
> という自分の投稿から1年近くたった今頃、解決策があっさり見つかりました。
> 
> 何の気もなしにマニュアルを眺めていたら、
> http://www.php.net/manual/ja/function.apache-note.php
> apache_note()という関数を見つけ、
> そのユーザーコメント(しかも1999年の^^;)に貴重なヒントがありました。
> 
> 早い話が、apacheのhttpd.confに、たとえば
> 
> LogFormat   "%h \"%{username}n\"" 
> 
> と書いておいて、phpスクリプトに
> 
> <?php
>   $username = "hogehoge";
>   apache_note('username',$username)
> ?>
> 
> とあれば、そのphpにアクセスすると、apacheのログには
> 
> xxx.xxx.xxx.xxx "hogehoge"
> 
> と出力されます。
> 
> この方式と、たとえばanalogなどのログ解析ツールや、
> あるいは単純にgrepを組み合わせれば、
> どのユーザーがどのページをどんな順番で見たのか、
> 一目瞭然に把握することができるでしょう。
> 
> 例えば、ユーザー管理された会員制サイト等では重宝するのでは?
> 
> 
> 注:このモジュールの関数は、Apache 1.x モジュールとして
>     PHPを実行して いる場合のみ有効です。 

さっき、別解を思いついて試したらできたので報告します。

httpd.conf に
LogFormat   "%h \"%{X-username}o\"" 
と、「o」で拾うようにします。

<?php
$username = 'testuser';
header ('X-username: ', $username);
?>

にアクセスすると、

xxx.xxx.xxx.xxx "testuser"

と Apache の log に出力されます。

この方式では、

利点: PHP に限らず他言語モジュールでも CGI 経由でも記録可能
欠点: http header に出力するので、よろしくない場面ではよろしくないかも
1. header() の実行場所問題に考慮が必要
2. http header なので、アクセスした人、ならびに経路にはばればれ

です。
-- 
         =^^= HODA =^^=          http://www.tail.gr.jp/~hoda/
澤田保隆@しっぽアルゴリズム情報研究所  mailto:hoda @ tail.gr.jp


PHP-users メーリングリストの案内