简单的实时独特访客计数器,数据库压力低?

时间:2011-10-31 13:05:07

标签: php jquery mysql visitor visitor-statistic

实时独特计数器的优良做法是什么,不会对负载下的数据库造成伤害?

4 个答案:

答案 0 :(得分:2)

压力最小?外包问题:),例如,使用Google Analytics

(谷歌分析不是实时的。其他分析工具提供商提供实时解决方案,例如,KISSmetrics

答案 1 :(得分:0)

包含行visitor_counterip的数据库表when。然后在每个页面加载时,检查用户的ip是否在when(datetime字段或包含时间戳的int字段)的给定时间内在数据库中。如果ip在数据库中,则不要执行任何操作。如果不是,请添加它。然后根据自when以来经过的时间定期修剪值。您可以使用COUNT(ip)来访问总人数。

可以对其进行调整,以便在最后X个时间内向访问者显示,并且您可以添加visits字段以查看用户已加载的页数等。

我不完全确定这会如何表现,但从理论上讲,它会做你想要的,我想。

答案 2 :(得分:0)

如果您正在构建一个网站并需要计数器,那么可以使用大量免费的分析(Google Analytics,Yahoo Analytics等)和计数器服务,这些服务可以提供比一些简单的计数器脚本更多的信息。这是我的建议。

但是,如果您自己构建并控制服务器,则可以使用其他工具进行实际计数。我已经为此目的使用了memcache,因为它支持“add”和“increment”方法,当另一个方法调用时(由于使用命令的限制)可以创建这样的高速实时计数器。

Memcache非常快(在慢速计算机上每秒200,000次请求)内存缓存解决方案,但不是永久存储。您将需要另一种解决方案来存储计算的数字。

这是我对此类任务的解决方案,在其自己的函数中添加到请求的开头:

$m = new Memcache;
$m->addServer('localhost', 11211);

$cacheKey = "performance_".gmmktime();

// Add in case it doesn't exist, no compression, 1 hour timeout
$m->add($cacheKey, (int) 0, false, (60*60));
// Increment cache
$m->increment($cacheKey, (int) 1);

更改$ cacheKey还可以计算多个不同的内容。

然后我有另一段代码,每分钟在cron脚本中收集这些信息并将其添加到数据库中。此解决方案还可以在多台计算机上运行,​​具体取决于您的实现需求,从而实现可扩展的计数器实现。

显然,这只是一个简单的例子,但希望你能看到它的用途。此代码用于运行PHP的大型多服务器游戏服务。

答案 3 :(得分:0)

您可以使用(自定义)会话处理程序将用户会话存储在数据库或缓存系统中,如APC或Memcached。

这样您就可以计算网站的活动会话数(每个访问者都有一个唯一的会话ID)。

您为会话提供非常短的会话超时,以防止用户被计为“有效”,即使他们不再访问您的网页。

通过使用会话,即使多人共享同一个IP地址,您也可以跟踪当前网站上的人数