如何在PHP中监视用户的带宽消耗

时间:2016-01-01 10:07:02

标签: php codeigniter monitoring bandwidth

好的,我知道这是一个奇怪的问题,可能无法实现,所以我们将不胜感激。

无论如何,我想知道我给每个用户多少带宽。我在登录网站时识别用户。

所以基本上对于每个请求,我想知道该请求使用了多少带宽。如果用户当时登录,我会将金额添加到他的帐户中。

将使用codeigniter,但我怀疑这会产生影响。

至少现在,所有东西都将在与Apache相同的基于Linux的服务器上。

理想情况下,我想要的解决方案不仅限于托管类型。

将使用Google云或亚马逊AWS。如果解决方案仅限于谷歌云或aws,它将有效。

2 个答案:

答案 0 :(得分:2)

既然你说你在Apache上,这里有2个想法。

第一个想法(一般的想法,但有趣的想法......):

Cookie随服务器上的每个请求一起发送(包括所有图像等)。当用户登录时使用PHP设置cookie并将其命名为USERTOKEN,然后将其值设置为该用户id的md5 + salt。

%{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调用的PHP文件(本例中过于简化,可以使用mod_rewrite规则进行简化)然后在其中你可以记录该用户的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日志配置中执行以下操作:

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

答案 1 :(得分:0)

  

您可以使用亚马逊的API检查带宽使用情况,而不是   使用日志。正如你所说的那样,你正在使用s3进行管理   如果为每个用户创建一个新存储桶,那么资产就会很好   并检查带宽使用情况,然后限制帐户,如果他/她   超过了这个限制。

Source:

可能的解决方案:

Limiting Membership By Bandwidth

Track User Bandwidth With PHP Application

相关问题