既然你说你是在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 –