php计数器 线程安全,php 高并发的计数器 排它型锁定

de647c02a396977619bd098b86c54b45.png

php计数器原理很简单.将数据写入到文本中.然后读出来加1 再写进去.

不过遇到高并发就完蛋了.我有两种办法能解决这个问题.

方法一.利用sqlite数据库实现高并发(节假日统计用的这个方法)

header("content-Type: text/html; charset=utf-8");

//应用举例

require_once("Sqlite.class.php");

//创建实例

$DB=new SQLite("count.db"); //这个数据库文件名字任意

//创建数据库表。

//$DB->query("create table count(id integer primary key,name varchar(50),value integer)");

$name="count";

echo docount($name,1);

function docount($name="",$num=0){

global $DB;$num=intval($num);$oldnum=1;

$name=trim($name);

$count=$DB->getone("select value from count where name="".$name.""");

if(!empty($count) && $count["value"]>0){

if(empty($num)){ return $count["value"];}

$oldnum=$count["value"];

}

if(empty($num) || empty($count)){

$DB->query("insert into count(name,value) values("".$name."","".$oldnum."")");

return $oldnum;

}else{

$newnum=$oldnum+$num;

$DB->query("update count set value=value +".$num." where name="".$name.""");

return $oldnum;

}

}

?>

完整代码:https://gitee.com/web/codes/8sovg2j4id736panczykx42

方法二.php文件排它型锁定实现高并发

$name="count";

echo docount($name,1);

function docount($name="",$num=0){

$num=intval($num);$oldnum=1;

$name=trim($name);

$file="./count/".$name.".txt";

$fp = fopen($file, "a+");

if (flock($fp, LOCK_EX)) {// 进行排它型锁定

$oldnum = trim(fgets($fp,4096));

$oldnum = intval($oldnum);

if($num>0){

$newnum=intval($num+$oldnum);

ftruncate($fp, 0); //将文件截断到给定的长度

fseek($fp, 0, SEEK_SET);

fwrite($fp, $newnum);

fflush($fp); //将缓冲内容输出到文件

}

flock($fp, LOCK_UN); // 释放锁定

fclose($fp);

return $newnum;

} else {

fclose($fp);

return $oldnum;

}

}

?>

两种方法实现的效果基本上一样.不过还是感觉排它型锁定肯定计数上会有减少. 现在还不太确定哪个效率更高计数更准确.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值