在瑞典最受欢迎的网站之一工作时,我遇到了一个(对我而言)奇怪的片段,每个页面上都有这个片段:
if( rand(0, 100) === 50 )
// increase visitor count
这样做会生成一个随机数,如果它等于一个固定数字(在这种情况下为50),它将增加访问者数量。在显示统计信息的页面上,访问者计数在显示之前乘以,例如,100。
我确实意识到为每个页面视图写入数据库可能并不理想,特别是对于像这样的非常大的网站。但这真的能产生正确的统计数据吗?仅仅因为99名访客的随机数等于一切,但100并不意味着下一个将获得100。
我是否反应过度,或者这是一个糟糕的统计实施?
答案 0 :(得分:1)
好的,我想我已经知道了。简而言之 - 这种方法可以足够准确&我从“瑞典最受欢迎的网站之一”中理解的一种好方法。让我解释一下:
有三个因素:
我可以将其翻译成代码:
在任何页面中都可以看到:
//are you here? you are an ACTUAL visit
if(rand(0, 100) === 50){
//are you here? you are a TRACKED visit
//passing info to the database as current number+1
}
并在统计页面中:
//variable $tracked is number of tracked visits from the page
//this is a CALCULATED visit
echo 'Page visits: '.$tracked*100;
我还可以说,实际访问也有可能成为1%的跟踪访问。但现在出现以下问题:为什么我到底需要跟踪1%的访问量?我不能跟踪所有的访问吗?
如果每个页面 1000次/分钟,此方法很棒 性能提升,并且可以给出相当好的结果(足够接近 实际访问)。
如果每个页面 100次/分钟,此方法也可以提升一些 性能,可能会给出非常准确的结果。
谈论性能,想象每分钟1000个数据库查询。我个人认为这样做并不好。因此,为了减少查询量,您(或者他们)实际上通过在数据库的入口处放置一个“警卫”来限制对数据库的调用次数,向您询问一个随机问题,只是为了平衡人数内部。
当然,你必须在性能和准确度之间找到完美的平衡点。你可以自己模拟它:
$actual
将帮助您找到最终结果的准确性$hits
将显示点击次数(人们通过后卫)$hit_chance
将限制传递结果的数量。性能越高,性能越好,但精度越低。看它!如果设置为100,则机会为%1(1/100),如果设置为10000,则机会为1/10000,如果设置为10 1/10(10%),等等... $final
将显示计算的访问次数。<子> 子>
$actual = 7000; //set the number of visits you want to check (check the current site statistics!)
$hits = 0; //initialization of variable
$hit_chance = 100; //set hit chance, currently 1%
$answer = intval(round($hit_chance / 2, PHP_ROUND_HALF_UP)); //just set answer between 0 and $hit_chance, which is an integer
for($i=0;$i<$actual;$i++){
if(rand(0, $hit_chance) === $answer){
$hits++;
}
}
$final = $hits * $hit_chance;
$accuracy = 100 - ((($actual - $final) / $actual) * 100);
echo 'Actual visits: '.$actual;
echo '<br>Hits: '.$hits;
echo '<br>Final results: '.$final;
echo '<br>Result accuracy: '.$accuracy.'%';
再想一想,这取决于你 - 我认为没有好/坏的方法。也许服务器非常好,你不需要它,也许它们需要一些性能节省。
答案 1 :(得分:0)
他们拥有的记录越多,它就越准确。一旦他们有大约1.000.000次点击,就可以肯定地说他们有非常准确的统计数据,因为从长远来看,数学运算会很平稳。
从短期来看,我觉得非常糟糕。