最近我做了一个带锁的文本方式计数器,目前放在我在奥索的主页上运行。该程序首先判断是否有计数器文件,若无则生成一个并设初值为0。需要计数时读取计数器文件原来的值,加一后再写回计数器文件。
在写计数器文件时用flock进行写锁定,在关闭文件时进行读写锁定。
<?php
//*************************
// 计数器 TextCounter()
// 作者 abccs
// http://abccs.oso.com.cn
// 2001.5.4
// (引用时请保留此部分)
//*************************
function TextCounter() {
$TxtCounterFile="counterfile.txt"; //计数器文件,记录访问次数
if (!file_exists($TxtCounterFile)) { //是否存在计数器文件
if (!file_exists(dirname($TxtCounterFile))) {
mkdir(dirname($TxtCounterFile), 0700);
}
$fp=fopen($TxtCounterFile,"w"); //生成计数器文件
if(flock($fp,2)) //写锁定
{
fputs($fp,0); //计数器初始值为0
}
if(flock($fp,3)) //读写锁定
fclose($fp);
}
$fp = fopen($TxtCounterFile,"rw");
$num = fgets($fp,15); //读取计数器原来的计数值
fclose($fp);
$num += 1; //计数器加1
print "$num"; //输出计数值
$fp=fopen($TxtCounterFile,"w");
if(flock($fp,2)) //写锁定
{
fputs($fp,$num); //保存新计数值
}
if(flock($fp,3)) //读写锁定
fclose($fp);
}
在需要显示计数的地方加上<?php TextCount(); ?>就可以了。该程序在我的主页上运行正常,有兴趣者可以去参观 http://abccs.oso.com.cn
在Windows98下需将所有的flock语句去掉。
|