1 回答
TA贡献1875条经验 获得超3个赞
一个包含访客计数器的简单文本文件可以做到这一点,
<?php
function visitor_counter():int{
static $cache=null;
if($cache!==null){
return $cache;
}
$fp=fopen("index.visitor_counter.txt","c+b");
flock($fp,LOCK_EX);
$cache=(int)stream_get_contents($fp);
++$cache;
rewind($fp);
fwrite($fp,(string)$cache);
flock($fp,LOCK_UN);
fclose($fp);
return $cache;
}
然后只需在您的索引文件中调用visitor_counter()。
如果您想知道为什么我要使用 flock() 而不是简单的 file_get_contents(),那是因为如果有几个人同时访问您的网站,例如如果计数器为 100 并且有 2 人访问,则可能会发生竞争条件同时,2 个不同的 php 实例100从文件中读取,并将其增加到101,然后写101回硬盘两次,在这种情况下,文本文件将包含不正确的数字101而不是正确的数字102,但是 flock() 在这里使确保不会发生这种情况,通过让 php 实例 #2 等到实例 #1 读取并更新文件(#2 将等待 #1 执行 LOCK_EX 到 #1 执行 LOCK_UN,然后 #2 执行完全相同的操作~)。
这是一个易于理解但存在漏洞(容易出现上述竞争条件)的实现:
function visitor_counter():int{
$visitors=(int)file_get_contents("index.visitor_counter.txt");
++$visitors;
file_put_contents("index.visitor_counter.txt",(string)$vistors);
return $vistors;
}
(不要使用最后一个实现,它被窃听了。)
- 1 回答
- 0 关注
- 137 浏览
添加回答
举报