あなたがApacheの上にあると述べたので、ここでは2つのアイデアがあります。
まず考え方(考えるので、そのアイデアが、楽しみが...):
クッキーは、(すべての画像などを含む)は、サーバー上のすべての要求で送信されます。ユーザーがログインしてPHPでクッキーを設定し、USERTOKEN
という名前をつけたら、その値をそのユーザーのIDのmd5 + saltに設定します。
%{USERTOKEN}C
と%B
をカスタムLogFormat
ディレクティブに挿入します。あなたがphp_bandwidth_logを解析し、元のユーザーのIDにマッピングするためのスクリプトを作成し、その後
LogFormat "%B %{USERTOKEN}C" php_bandwidth_log
CustomLog "logs/php_bandwidth_log" php_bandwidth_log
:
%{Foobar}C The contents of cookie Foobar in the request sent to the server.
Only version 0 cookies are fully supported.
%B Size of response in bytes, excluding HTTP headers.
は今、あなたはこのようになりますカスタムログ形式を作成します。
残念ながら、誰かが(おそらく)Cookieを渡さずにサイトのコンテンツにアクセスする可能性があるので、この考え方は間違いありません。とにかく、あなたの状況に応じて、これはあなたのために働くかもしれませんが、そうでなければ、代わりに、もっと良いアイデアは基本的にPHPスクリプトを使ってすべてのコンテンツをルーティングするので、
セカンドアイデア(良い):
ので、この/files.php?path=/blah/blah.jpg
のように呼び出すことができるPHPファイルを作成します(この例では単純化しすぎ、mod_rewriteのルールにアップprettiedすることができる)、それの内側にあなたあなたそのユーザーのIDを記録し、アクセスされたファイルを追跡できます。これは、ファイルを追跡したいと仮定しています。これは、ページ上に生成されたHTMLを追跡していないでしょう。おそらく前述のカスタムApacheログの考え方を使うことができますが、その情報を得るために少し修正してください。ここで
は、あなたのアイデアを得るのを助けるためにいくつかの擬似コードです:
if (!$hasSession) {
die("Invalid session");
}
$size = filesize($path);
insert_into_bandwidth_table($userId, $size);
header("Content-Type: ...");
readfile($path);
次はあなたが実行PHPスクリプトのためだけに応答サイズを追跡することができますが、あなたのようにPHPを実行している場合にのみ動作します方法ですモジュール。
あなたのPHPにこのようなものを追加してください。基本的にこれはApacheのログ書き込みのために、この変数を読み取ることができます:
apache_note("PHP_USER_ID", 1234);
apache_note - apache_note - Apacheリクエストを取得し、設定
説明注意事項:この関数は、Apacheのtable_getおよびtable_setのラッパーです。リクエスト中に存在するノートの表を編集します。表の目的は、Apacheモジュールが通信できるようにすることです。
Read more here
その後、あなたのhttpd.confログの設定では、このような何か:ちょうど
%{Foobar}n The contents of note Foobar from another module.
そして...:ドキュメントからノートに
LogFormat "%B %{PHP_USER_ID}n" php_bandwidth_log
CustomLog "logs/php_bandwidth_log" php_bandwidth_log
情報をあなたがモジュールとしてそれを実行していない場合に備えて、apache_noteに代わるものがあることを認識しました。あなたはこのLogFormatディレクティブ使用するログインに続いて
apache_setenv('PHP_USER_ID', $userId, TRUE);
::あなたのPHPコードの代わりにこれを行うだろう
LogFormat "%B %{PHP_USER_ID}e" php_bandwidth_log
を同じサーバー上のすべてのものですか? – Clay
そして、あなたはどのWebサーバーを実行していますか? Apache?または別のもの? – Clay
@Claytonは遅く応答して申し訳ありません。はい、すべてが同じサーバー上にあり、Apacheを使用しています –