2016-01-01 51 views
6

好吧,我知道这是一个奇怪的问题,可能是不可能的,这样的想法,将不胜感激。如何监视用户的带宽消耗在PHP

无论如何,我想知道我给每个用户带来多少带宽。当他登录到网站时,我确定了一个用户。

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

将使用笨,但我怀疑有差别。

所有的东西都会在同一台基于Linux的服务器上运行Apache,至少现在是这样。

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

将使用谷歌要么云或Amazon AWS。如果解决方案仅限于谷歌云或aws,它将起作用。

+0

是在同一台服务器上的一切吗? – Clay

+0

而且,你在运行什么web服务器? Apache的?或另一个? – Clay

+0

@Clayton对于迟到的回复感到抱歉。是的,一切都在同一台服务器上,并将使用Apache –

回答

2

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

谢谢你。这些都是美妙的想法!在这些方向上进行一些探索可以解决这个问题。基于cookie思路的另一个想法。我们知道哪个用户在什么时间通过哪个IP访问网站。解析apache日志文件时,我们可以使用这些信息(在日志文件中使用ip打印带宽)。这将解决空的cookie问题,但使其他事情更复杂。 –

+0

如果您想要了解第二个想法,那么我只是编写了执行PHP脚本的请求大小。缺点是它会迫使你将PHP用作一个可能不合意的模块。尽管我们在之前的工作中做过这个,但它工作得很好。所以,这个+文件路由将使它始终拥有用户ID。 – Clay

+0

aha ...它看起来像你可以使用'apache_setenv'而不是'apache_note',我相信它会绕过将PHP作为模块的需要。再次,apache_note/apache_setenv将只能记录在会话中运行的PHP脚本的大小,而不是任何外部加载的不是PHP脚本的文件。 – Clay

0

您可以使用amazon的API检查带宽使用情况,而不是使用日志的 。如您所说您使用s3来管理 资产,如果您为每个用户 创建一个新存储区并检查带宽使用情况,并在其超过该限制时限制该帐户,那么将会很有用。

Source: 

可能的解决方案:

Limiting Membership By Bandwidth

Track User Bandwidth With PHP Application

+1

永久用户的新桶? Yeesh。 AWS在默认情况下将您限制为100个存储桶。 – ceejayoz