实时独特计数器的优良做法是什么,不会对负载下的数据库造成伤害?
答案 0 :(得分:2)
压力最小?外包问题:),例如,使用Google Analytics。
(谷歌分析不是实时的。其他分析工具提供商提供实时解决方案,例如,KISSmetrics)
答案 1 :(得分:0)
包含行visitor_counter
和ip
的数据库表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地址,您也可以跟踪当前网站上的人数