我正在尝试编写一个点击上限程序 - 基本上是流量控制。(在菲律宾语中)
我的目标是记录(到文本文件)每小时的点击次数(使用增量计数器)。从那里,我将编写一个程序,根据是否达到点击上限来重定向流量。所以。。。对其进行伪编码
if ($cap <= $currentCount){ //cap is the max, currentCount is the current click rate
go here
}else{
go here
}
我不确定如何访问的数据是$currentCount。基本上,它是 24 小时内的总点击次数。如何记录?
我该如何开始处理这个问题?有什么线索、提示或提示吗?我对如何解决这个问题几乎一无所知。
:编辑:
我发现了这个问题的合理解决方案。我将在下面为将来遇到这种需求的人重点介绍它。
我的公司处理 buku 流量。因此,我们需要一种方法来管理多余的部分,并将其引导到需要的地方。我们的目标是编写某种点击计数器,使我们能够保持点击上限(如果我们在一个广告上获得每天的最大点击次数,并且我们不想通过将其发送到该网站和这些广告来浪费我们的流量,我们希望能够重定向到另一个)。
我们将使用 Redis 来完成此任务,因为在流量非常繁重的情况下使用数据库的 I/O 会耗尽数据库,并且出于同样的原因,使用文件系统解决方案是不可能的(如下所述,将导致文件锁定和点击日志记录丢失)。
像这样:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->set('key', 'val');
echo $redis->get('key');
$redis->incr( 'counter', 1 ); // increment your counter
$counter = $redis->get( 'counter' );
if ( $counter > 100000 ) redirect( site1 );
redirect( site2 );
感谢所有帮助过的人!
使用文本文件将是一个非常糟糕的主意,因为有两件事:
-
并发访问。 如果两个用户同时点击怎么办?幸运的是,这两个中最快的一个将打开文本文件并写入它。如果有文件锁定,第二个将无法写入,因为它无法锁定文件,或者(如果你写了一些复杂的东西)它将等待并占用处理时间,直到它可以打开文件。 如果没有文件锁定,两个进程将同时打开同一个文件,并且只有最后保存文件的哪个进程才会实际保存其更改。 从本质上讲,要么只有一个用户会被记录,要么第二个用户会遇到烦人的延迟。
-
文件可能会变大。 它越大,添加到日志和检索日志所需的时间就越长。
您应该使用数据库表(如 MYSQL),而不是使用文本文件。 这真的很容易。 (如果您使用 MYSQL,请使用 mysqli 或 pdo。 不要使用 mysql_*,因为它已弃用。 互联网上有很多mysql_*函数的例子,因为它们是旧的例子。 不要使用它们。
您所要做的就是使用一些基本代码,每次有人单击您的页面时,这些代码都会在数据库表中插入一行。 此表应具有一个名为 ClickTime 的时间戳列,该列设置为自动将自身设置为 CURRENT_TIMESTAMP,而无需执行任何操作。 如果您唯一需要的信息是发生了点击,您只需要说
INSERT INTO clicklogtable
如果您需要跟踪IP地址,那将更像
INSERT INTO clicklogtable (ClickIP) VALUE ('xxx.xxx.xxx.xxx')
然后,您可以要求数据库轻松地为您提供过去 24 小时内的行数:
SELECT COUNT(ClickID) AS NumberOfClicks FROM clicklogtable
WHERE ClickTime >= NOW() - INTERVAL 1 DAY
其中的"点击次数"值是您对最后一天点击次数的回答。 相同的语法可以获取最后一个小时、过去 45 分钟或您想要的任何其他时间间隔。
我首先要开始看jQuery。
实际捕获鼠标点击的唯一方法是客户端。这种方法是在每次单击时向服务器发送 AJAX 请求,或者跟踪计数器并将其每隔几分钟发送到服务器,等等。但请注意,客户端方法很容易被其他人伪造,从而触发您的脚本,即使没有必要。
但是,您可能需要详细说明点击的确切含义,因为上述情况似乎不太可能。如果您的意思是访问请求,您可以
- 解析过去一小时内请求的 Apache 访问日志文件
- 在每个请求中输入数据库条目
- 为每个请求写入单独的文件
我推荐第一种方法,因为这对你的表现影响最小。
希望我已经完全回答了:)