-2

我正在尝试编写一个点击上限程序 - 基本上是流量控制。(在 PHP 中)

我的目标是记录(到文本文件)每小时的点击次数(使用增量计数器)。从那里,我将编写一个程序,根据是否达到点击上限来重定向流量。所以......对其进行伪代码

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 );

感谢所有帮助过的人!

4

2 回答 2

2

我首先要开始研究 jQuery。

实际捕获鼠标点击的唯一方法是客户端。解决方法是在每次点击时向服务器发送 AJAX 请求,或者跟踪计数器并每隔几分钟将其发送到服务器,等等。但是请注意,客户端方法很容易被其他人伪造,从而即使没有必要也会触发您的脚本。

但是,您可能需要详细说明点击的确切含义,因为上述情况似乎不太可能。如果您的意思是访问请求,您可以

  1. 解析过去一小时内的请求的 Apache 访问日志文件
  2. 在每个请求上输入一个数据库条目
  3. 为每个请求写入单独的文件

我推荐第一种方法,因为这对你的表现影响最小。

希望我已经完全回答了:)

于 2013-10-15T22:54:11.883 回答
2

由于两件事,使用文本文件将是一个非常糟糕的主意:

  1. 并发访问。如果两个用户同时点击怎么办?这两个中最快的幸运者将打开文本文件并写入它。如果存在文件锁定,则第二个将无法写入,因为它无法锁定文件,或者(如果您编写一些复杂的东西)它将等待并占用处理时间,直到它可以打开文件。如果没有文件锁,两个进程将同时打开同一个文件,只有最后保存文件的那个才会真正保存其更改。从本质上讲,要么只有其中一个用户会被登录,要么第二个用户会遇到烦人的延迟。

  2. 文件可能会变大。它越大,添加到日志和检索日志所需的时间就越长。

您应该使用 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

那里的“NumberOfClicks”值是您对最后一天点击次数的回答。相同的语法可以为您提供最后一小时、最后 45 分钟或您想要的任何其他时间间隔。

于 2013-10-15T23:35:30.870 回答