PHP中利用文件锁实现日志写入和网站接口访问等常见场景下的并发控制

1//---并发下日志写入方案 2$fp = fopen('./log/test_log.txt', 'a+'); 3if (flock($fp, LOCK_EX)) { 4 fwrite($fp, '1\n'); 5 flock($fp, LOCK_UN); 6 } 7fclose($fp); 8 9//---接口并发控制示例 这个只是测试案例,可以将锁的粒度按照一定维度或者标识往下切割到更细来提高性能 10public function test() 11 { 12 $id = $_REQUEST['id']; 13 14 $fp = fopen('./test_log.txt', 'r'); 15 16 //打开后给被访问的文件施加排他锁(阻塞模式) 用以阻塞执行代码期间 其它进程对这个文件的访问 让其它进程处于等待状态 17 if (flock($fp, LOCK_EX)) { //如果需要非阻塞模式可以用 LOCK_EX | LOCK_NB 18 //以下进行业务逻辑的处理 19 $list = M("test")->where("id={$id}")->find(); 20 21 if ($list && $list['status'] < 1) { 22 $add_data['test_id'] = $id; 23 $add_data['time'] = $_SERVER['REQUEST_TIME']; 24 $add_rus = M("test_log")->add($add_data); 25 if ($add_rus) { 26 $save_data['id'] = $id; 27 $save_data['status'] = 1; 28 $up_rus = M('test')->save($save_data); 29 } 30 } 31 //以上进行业务逻辑的处理 32 33 flock($fp, LOCK_UN);//记得解锁,PHP5.3.2以后的版本不再在调用fclose的时候自动解锁 34 } 35 36 fclose($fp); 37}
点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

springboot学习(四) 日志管理

1、简介  SpringBoot内部日志系统使用的是CommonsLogging,但开放底层的日志实现。默认为会JavaUtilLogging,Log4J,Log4J2和Logback提供配置。每种情况下都会预先配置使用控制台输出,也可以使用可选的文件输出。 2、日志格式  默认的日志输出格式为:1201

PHP写入日志文件

/写入文件$paytype文件名$content内容(string类型)/publicstaticfunctiondingdinglog($paytype,$content)$filename$SERVER'DOCUMENTROOT'.'/log/';$filename$filename.$paytype.

ThinkPHP 5.0.x 反序列化漏洞 PoC

因为写入的文件名包含特殊符号,所以该漏洞只能在Linux中写入webshell,不能在Windows系统写入。这个漏洞的重点在于体会ThinkPHP的反序列化利用链。演示环境:Kali、ThinkPHP/5.0.24演示代码:application/index/controller/Index.php<?p

PHP创建多级树型结构

<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n

Java日志体系(六)log4j2

1.1简介            !(https://oscimg.oschina.net/oscnet/495f965815e196a8e347514c4408c5ca35d.png)log4j2,一个日志的实现框架,是log4j的升级版本,于2014年7月正式亮相。与第一代log4j不同,log4j2完全重写了log4j的日志实现,