PHP文件锁

PHP文件锁一、文件锁是什么?    顾名思义,对文件上锁。    可以通过“进门”的实际情况来理解:    有多个人要通过一个大门到食堂里吃饭,但食堂只有一个座位。     食堂管理员A有点偷懒,不想等那么久,于是就告诉大家,中午都可以来食堂吃饭,但是要跑快点才行,只有一个座位,第一个到的人就可以在食堂吃饭,然后就会锁门,其他人看到门锁上了就哪来的回哪去吧,这…

大家好,又见面了,我是你们的朋友全栈君。

一、文件锁是什么 ?

        顾名思义,对文件上锁。

        可以通过“进门”的实际情况来理解:

        有多个人要通过一个大门到食堂里吃饭,但食堂只有一个座位。

        食堂管理员A有点偷懒,不想等那么久,于是就告诉大家,中午都可以来食堂吃饭,但是要跑快点才行,只有一个座位,第一个到的人就可以在食堂吃饭,然后就会锁门,其他人看到门锁上了就哪来的回哪去吧,这就是非阻塞型文件锁

        食堂管理员B不希望让人吃不上饭,也不希望大家坐地上吃饭,所以就通知大家在门外排队,一个人进来吃完后,下一个人才允许进来。所以当第一个人进大门后,管理员B就把大门锁上,等第一个人吃完后,再解锁打开大门让第二个人进来,这就是阻塞型文件锁

       比喻不是完全正确,但是那么个意思,凑合着理解一下。

二、文件锁有什么作用 ?        

        锁机制之所以存在是因为并发导致的资源竞争,为了确保操作的有效性和完整性,可以通过锁机制将并发状态转换成串行状态。作为锁机制中的一种,PHP的文件锁也是为了应对资源竞争。

        假设一个应用场景,在存在较大并发的情况下,通过fwrite向文件尾部多次有序的写入数据,不加锁的情况下会发生什么?多次有序的写入操作相当于一个事务,我们此时需要保证这个事务的完整性,所以加锁具有一定的必要性。

三、实际使用效果展示

  1. 不使用文件锁

<?php
    // 1. 打开文件
    $lock_file = 'temp.lock';
    $fp = fopen($lock_file, 'a+');
    // 2. 打点
    fwrite($fp, "打点:".date("Y-m-d H:i:s",time())."\n");
    // 3. 延迟1秒
    sleep(1);
    // 4. 关闭文件
    fclose($fp);

  使用ab压力测试器执行文件十次,查看temp.lock:

  PHP文件锁

  2. 使用非阻塞型文件锁

<?php
    // 1. 打开文件
    $p_file = "temp.lock";
    $fp = fopen($p_file, 'a+');
    // 2. 判断是否已存在文件锁,存在(上锁失败)则退出
    if (!flock($fp, LOCK_EX + LOCK_NB)) {
        exit;
    }
    // 3. 上锁
    flock($fp, LOCK_EX + LOCK_NB);
    // 4. 给文件打点
    fwrite($fp, "打点:".date("Y-m-d H:i:s",time())."\n");
    // 5. 延迟1秒
    sleep(1);
    // 6. 解锁文件
    flock($fp, LOCK_UN);
    // 7. 关闭文件
    fclose($fp);

  使用ab压力测试器执行文件十次,查看temp.lock:

  PHP文件锁

  3. 使用阻塞型文件锁

<?php
    // 1. 打开文件
    $lock_file = 'temp.lock';
    $fp = fopen($lock_file, 'a+');
    // 2. 判断是否已经上锁
    if (!flock($fp, LOCK_EX)) {
        unlink($lock_file);
        exit;
    }
    // 3. 打点
    fwrite($fp, "打点:".date("Y-m-d H:i:s",time())."\n");
    // 4. 延迟1秒
    sleep(1);
    // 5. 解开文件锁
    flock($fp,LOCK_UN);
    // 6. 关闭文件
    fclose($fp);

  使用ab压力测试器执行文件十次,查看temp.lock:

  PHP文件锁

四、总结

通过上面三个简单代码示范,可以很清楚看到使用文件锁和不使用文件锁的区别,以及非阻塞型文件锁和阻塞型文件锁的区别:

不使用文件锁时,十个并发访问,同时执行插入,在这种情况下不但不能保持执行序列,还会丢失3条请求;

使用非阻塞型文件锁时,又只能有一条请求能通过,其他请求在并发同时访问到文件已经加锁,只好断开请求;

阻塞型文件锁的结果优势很明显,得到十条数据,并且按照1秒的顺序插入,这也是我们想得到的效果。

所以,在并发量较小的一些场景,可以考虑使用阻塞型文件锁,但是如果只是要得到一条有效数据,其他的都可以忽略的话,那也可以使用非阻塞型文件锁。

注意:文件锁的使用会增加服务器 I/O 的消耗,因此还是尽量少用,访问量较小、并发量小的情况下,可以考虑使用文件锁。如果涉及数据库操作顺序的话,可以使用mysql锁,但如果并发量太大的话,就要考虑缓存锁,利用缓存的时间来进行加锁控制。简单提提,后面有时间再做专门的整理。

不熟悉ab压力测试工具的朋友请参考我这篇文章:ab压力测试工具

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153477.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ubuntu16.04.3安装教程_Ubuntu16下安装QQ

    ubuntu16.04.3安装教程_Ubuntu16下安装QQUbuntu16.04.1安装NginxNginx(“enginex”)是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。Nginx是由IgorSysoev为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集

    2025年12月4日
    2
  • 生物化学与分子生物学分析技术 Analytical Techniques in Biochemistry and Molecular Biology 英文原版[通俗易懂]

    生物化学与分子生物学分析技术 Analytical Techniques in Biochemistry and Molecular Biology 英文原版[通俗易懂]长期以来,生物化学被定义为生命科学的核心学科,现在它使我们能够以十年前甚至做梦都想不到的方式控制生命系统。随着植物生物学和生物技术在科学议程上不可阻挡地向前发展,其相关性也与日俱增。这本综合卷探讨了植物生物学、生物化学和生物技术研究人员必须掌握的众多实验技术。随着人们对调查生理过程的生化和分子方法的兴趣上升,新的、更快、更敏感的实验程序也在同步发展,使我们能够探索动物和植物有机体的内部运作。ebook获取<<<…

    2022年7月11日
    16
  • 今天下午借了两本Cisco的书。

    今天下午借了两本Cisco的书。

    2021年7月23日
    57
  • C3P0连接池配置和实现详解「建议收藏」

    C3P0连接池配置和实现详解「建议收藏」C3P0连接池配置和实现详解===================================================================2016年netty/mina/javanio视频教程java游戏服务器设计教程互联网架构师教程:http://blog.csdn.net/pplcheer/article/details/718

    2022年6月11日
    26
  • C语言 sprintf函数使用详解

    C语言 sprintf函数使用详解srpintf()函数的功能非常强大:效率比一些字符串操作函数要高;而且更具灵活性;可以将想要的结果输出到指定的字符串中,也可作为缓冲区,而printf只能输出到命令行上~头文件:stdio.h函数功能:格式化字符串,将格式化的数据写入字符串中。函数原型:intsprintf(char*buffer,constchar*format,[argument]…)参数:…

    2022年6月22日
    46
  • php批量修改怎么实现,PinPHP购物分享系统2.2后台批量采集修改实现方法

    php批量修改怎么实现,PinPHP购物分享系统2.2后台批量采集修改实现方法因前段时间较忙,所以一直将这开发搁置了。今天看了一下新版的PinPHP,又心血来潮于是写了一下这个批量采集的实现,没想到写了差不多一两小时就实现了,虽然写得比较简单,也算是可以帮助一键采集一个分类。同时非常感谢PinPHP团队开发出如此好使的开源程序,哈,闲话先不多说,上代码。附源文件:下载源代码请猛击这里>>主要是对一个模板文件作了修改。/PinPHP_V2.21/admin/Tpl…

    2022年6月6日
    23

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号