编写一个程序,用于 1 小时/24 (PHP) 内的点击次数


Writing a program for number of clicks in 1 hr/ 24 (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 );

感谢所有帮助过的人!

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

  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

其中的"点击次数"值是您对最后一天点击次数的回答。 相同的语法可以获取最后一个小时、过去 45 分钟或您想要的任何其他时间间隔。

我首先要开始看jQuery。

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

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

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

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

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