既然你說你是在Apache,這裏有2個想法。
第一個想法(馬馬虎虎的想法,但有趣的思考......):
Cookie與服務器(包括所有圖像等),在每次請求發送。當用戶登錄時設置PHP和名字的cookie它USERTOKEN
它的價值,然後設置爲用戶的ID的MD5 +鹽。
將%{USERTOKEN}C
和%B
插入到自定義LogFormat
指令中。現在
%{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.
,您創建一個自定義日誌格式,看起來像這樣:
LogFormat "%B %{USERTOKEN}C" php_bandwidth_log
CustomLog "logs/php_bandwidth_log" php_bandwidth_log
然後,創建一個腳本來解析php_bandwidth_log並將其映射到原始用戶的ID。
不幸的是,這個想法並非萬無一失,因爲有人仍然可以通過不通過cookie(可能)來假設訪問網站內容。總之,根據您的情況,這可能爲你工作,如果不是,另一種更好的思路是基本的路線,通過PHP腳本的所有內容,所以你可以做任何記錄你想就可以了。
設想二(更好):
因此,創建一個可以這樣調用/files.php?path=/blah/blah.jpg
(簡單化了這個例子,可以與mod_rewrite的規則來美化了一番)一個PHP文件,然後裏面的它,你你可以記錄該用戶的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_note("PHP_USER_ID", 1234);
apache_note - apache_note - 獲取和設置Apache的要求指出
說明:此功能是Apache的table_get和table_set的包裝。它編輯請求期間存在的筆記表。該表的目的是允許Apache模塊進行通信。
Read more here
在httpd.conf日誌配置
然後做這樣的事情:
LogFormat "%B %{PHP_USER_ID}n" php_bandwidth_log
CustomLog "logs/php_bandwidth_log" php_bandwidth_log
信息就說明從文檔:
%{Foobar}n The contents of note Foobar from another module.
而且...只是如果你沒有把它作爲一個模塊運行,你會意識到還有一種替代方法可以使用apache_note。你的PHP代碼反而會做到這一點:
apache_setenv('PHP_USER_ID', $userId, TRUE);
然後登錄你會使用這個LogFormat指令:
LogFormat "%B %{PHP_USER_ID}e" php_bandwidth_log
是在同一臺服務器上的一切嗎? – Clay
而且,你在運行什麼web服務器? Apache的?或另一個? – Clay
@Clayton對於遲到的回覆感到抱歉。是的,一切都在同一臺服務器上,並將使用Apache –