Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中监控用户的带宽消耗_Php_Codeigniter_Monitoring_Bandwidth - Fatal编程技术网

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

如何在PHP中监控用户的带宽消耗,php,codeigniter,monitoring,bandwidth,Php,Codeigniter,Monitoring,Bandwidth,好的,我知道这是一个奇怪的问题,可能不可能,所以我很感激你的想法 无论如何,我想知道我给每个用户的带宽是多少。我在用户登录网站时识别他 所以基本上对于每个请求,我想知道该请求使用了多少带宽。如果用户当时登录,我会将金额添加到他的帐户中 将使用codeigniter,尽管我怀疑这会有什么不同 至少现在,所有东西都将与Apache在同一台基于Linux的服务器上 理想情况下,我想要一个不局限于托管类型的解决方案 将使用谷歌云或亚马逊AWS。如果该解决方案仅限于谷歌云或aws,它将起作用 您可以使用a

好的,我知道这是一个奇怪的问题,可能不可能,所以我很感激你的想法

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

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

将使用codeigniter,尽管我怀疑这会有什么不同

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

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

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

您可以使用amazon的API来检查带宽使用情况,而不是 使用日志。正如您所说的,您正在使用s3进行管理 对于这些资产,如果您为每个用户创建一个新的bucket就好了 并检查带宽使用情况,如果他/她 超过这个限制

可能的解决方案:


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

第一个想法(虽然想法一般,但思考起来很有趣……):

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

在自定义指令中插入
%{USERTOKEN}C
%B

%{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
LogFormat "%B %{PHP_USER_ID}n" php_bandwidth_log
CustomLog "logs/php_bandwidth_log" php_bandwidth_log
然后,创建一个脚本来解析php_带宽_日志并将其映射到原始用户的id

不幸的是,这个想法并不是万无一失的,因为有人仍然可以假设通过不传递cookie(也许)来访问站点内容。无论如何,根据您的情况,这可能适合您,如果不适合,另一个更好的方法是基本上通过PHP脚本路由所有内容,这样您就可以对其执行任何类型的日志记录

第二个想法(更好):

因此,创建一个可以像这样调用的PHP文件
/files.PHP?path=/blah/blah.jpg
(本例过于简化,可能会使用mod_重写规则进行预绑定),然后在其中您可以记录该用户的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模块进行通信

然后在httpd.conf日志配置中执行以下操作:

LogFormat "%B %{USERTOKEN}C" php_bandwidth_log
CustomLog "logs/php_bandwidth_log" php_bandwidth_log
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

所有东西都在同一台服务器上吗?还有,您运行的是哪台web服务器?阿帕奇?“还是另一个?”克莱顿很抱歉反应太晚。是的,所有东西都在同一台服务器上,将使用ApacheDon,不要使事情过于复杂。计算总带宽使用率。除以活动用户数。您现在有了平均每个用户的带宽使用率。您希望它包括PHP/HTML页面的请求大小+所有加载的JS/CSS/图像/视频/任何内容吗?我发布了一个答案,我想这会让你了解其中的一部分,但有时候这些东西说起来比做一个新的桶更容易?是的。默认情况下,AWS将您限制为100桶。谢谢。这些都是好主意!在这些方面进行一点探索就可以解决这个问题。另一个基于cookie的想法。我们知道哪个用户在什么时候通过哪个IP访问网站。我们可以在解析apache日志文件时使用此信息(打印带宽与日志文件中的ip一起使用)。这将解决空cookie问题,但会使其他事情变得更复杂。如果您同意第二个想法,我对如何仅为执行的PHP脚本调整请求大小进行了编辑。不利的一面是,它会迫使您将PHP作为一个模块使用,这可能是不可取的。我们在以前的工作中这样做了,但效果很好。因此,+文件路由将使您始终拥有用户id.aha…看起来您可以使用
apache_setenv
而不是
apache_note
,我相信这将绕过将PHP作为模块的需要。同样,apache_note/apache_setenv只能记录会话中运行的PHP脚本的大小,而不能记录任何非PHP脚本的外部加载文件。是否可能有多个用户从同一网络访问您的站点,因此他们的IP相同??。。。我想你可以绕过这一点,但值得一提。