文件锁有两种:共享锁和排他锁,也就是读锁(LOCK_SH)和写锁(LOCK_EX) 
文件的锁一般这么使用:

$fp = fopen("filename", "a");

flock($fp, LOCK_SH) or die("lock error")

$str = fread($fp, 1024);

flock($fp, LOCK_UN);

fclose($fp);

注意fwrite之后,文件立即就被更新了,而不是等fwrite然后fclose之后文件才会更新,这个可以通过在fwrite之后fclose之前读取这个文件进行检查

但是什么时候使用lock_ex什么时候使用lock_sh呢?

读的时候: 
如果不想出现dirty数据,那么最好使用lock_sh共享锁。可以考虑以下三种情况: 
1. 如果读的时候没有加共享锁,那么其他程序要写的话(不管这个写是加锁还是不加锁)都会立即写成功。如果正好读了一半,然后被其他程序给写了,那么读的后一半就有可能跟前一半对不上(前一半是修改前的,后一半是修改后的) 
2. 如果读的时候加上了共享锁(因为只是读,没有必要使用排他锁),这个时候,其他程序开始写,这个写程序没有使用锁,那么写程序会直接修改这个文件,也会导致前面一样的问题 
3. 最理想的情况是,读的时候加锁(lock_sh),写的时候也进行加锁(lock_ex),这样写程序会等着读程序完成之后才进行操作,而不会出现贸然操作的情况

写的时候: 
如果多个写程序不加锁同时对文件进行操作,那么最后的数据有可能一部分是a程序写的,一部分是b程序写的 
如果写的时候加锁了,这个时候有其他的程序来读,那么他会读到什么东西呢? 
1. 如果读程序没有申请共享锁,那么他会读到dirty的数据。比如写程序要写a,b,c三部分,写完a,这时候读读到的是a,继续写b,这时候读读到的是ab,然后写c,这时候读到的是abc. 
2. 如果读程序在之前申请了共享锁,那么读程序会等写程序将abc写完并释放锁之后才进行读。

转载于:https://www.cnblogs.com/yangf2016/p/5865632.html

php文件加锁 lock_sh ,lock_ex相关推荐

  1. php lock sh,php文件加锁 lock_sh ,lock_ex

    参考网站:http://hi.baidu.com/honly1215/item/8d27a66d11689c3aac3e83fe 文件锁有两种:共享锁和排他锁,也就是读锁(LOCK_SH)和写锁(LO ...

  2. python 中给文件加锁——fcntl模块

    如果没有fcntl模块则用 sudo pip install fcntl安装 模块简单说明: 打开文件,不存在则创建之 f = open('./test','w') fcntl.flock(f,fcn ...

  3. python os 文件锁_python 中给文件加锁——fcntl模块

    如果没有fcntl模块则用 sudo pip install fcntl安装 模块简单说明: 打开文件,不存在则创建之 f = open('./test','w') fcntl.flock(f,fcn ...

  4. python 加锁_python之给文件加锁(fcntl模块)

    对该文件加密:fcntl.flock(f,fcntl.LOCK_EX) 这样就对文件test加锁了,如果有其他进程对test文件加锁,则不能成功,会被阻塞,但不会退出程序. 解锁:fcntl.floc ...

  5. python文件加锁

    首先要引入库 import fcntl 打开一个文件 f = open('./test') 对该文件加密: fcntl.flock(f, fcntl.LOCK_EX) 这样就对文件test加锁了,如果 ...

  6. SVN ---文件加锁,执行clean up命令

    一.SVN 中 clean up 的功能 当Subversion改变你的工作拷贝(或是.svn中的任何信息),它会尽可能的小心,在修改任何事情之前,它把意图写到日志文件中去,然后执行log文件中的命令 ...

  7. 多线程并发思考--文件加锁

    多线程并发思考--文件加锁 在最近的工作中,经常要用到线程,就对线程相关知识稍微看了看,知道并发线程经常引起共享资源冲突,java以提供关键字synchronized的形式,为防止资源冲突提供了内置支 ...

  8. C Linux 文件加锁 lock fcntl

    Linux系统中,文件上锁的函数有两个Lock和fcntl ,前者主要是加建议性锁,后者既可以加建议性锁(默认)也可以加强制性锁,而且她还可以给某一记录进行上锁,即所谓的记录锁. fcntl文件锁有两 ...

  9. linux目录加了一把锁怎么办,linux 文件加锁 lockf 小结

    项目中涉及数据的读取和发送,由于对线程不熟悉,我将读取和发送分成了两个独立的程序,先实现功能再更新为多线程版本.但两个程序共用一个文件时同样会出现同步问题.所以必须加锁. 这次选择的是lockf.在实 ...

  10. java中文件加锁机制

    当同时对一个文件进行操作的时候,很可能出现错误甚至锁坏文件. 在某些情况下,有一个应用的两个实例同事操作一个文件,第一个实例应该锁定这个文件,第二个实例发现这个文件被锁定,是等待它解锁还是跳过文件操作 ...

最新文章

  1. libtorchWindows中的使用
  2. dockerfile cd目录_使用Werf和现有的Dockerfiles改善你的CI/CD体验
  3. 基于RobotFramework实现自动化测试
  4. Windows音频编程:Win32 Wave API 的使用
  5. APP测试之Monkey压力测试(二)
  6. Yearn正在评估恢复yDAI池的方式
  7. 科技公司钟爱的50款开源工具
  8. WinForm中的特殊窗体效果:渐变窗口和信息提示窗口
  9. 《机器人爱好者(第3辑)》——D机器人引领自动驾驶汽车之路
  10. php毕设周记_毕设周记(一)
  11. java 进程通信代码
  12. Struts2 基础入门
  13. Python爬虫 抓取拉勾招聘信息
  14. android中图片压缩上传方法之Luban库
  15. 数量积与向量积(点积与叉积)
  16. 恒指赵鑫:来说说止损
  17. Python中strip函数几种用法
  18. 深度学习目标检测——AP以及MAP
  19. 服务器显示post是什么意思,post请求 post请求是什么
  20. 梦想与行动:仰望星空,脚踏实地

热门文章

  1. Yii 2.0 权威指南(1) 第一次问候
  2. 简单搭建es6编译环境
  3. TCP新手误区–心跳的意义
  4. SpringCloud实战(四)Sentinel自定义降级异常实战
  5. 大学使用python 编辑器_Python数据分析|最多人用的代码编辑器推荐
  6. vue 动画 抖动效果_css开发常用动画
  7. java基础知识总结(经典)_Java基础知识总结(超级经典)(三)
  8. mysql数据库维护重要性_建立MySQL数据库日常维护规范
  9. status函数(自学数据结构第一天)
  10. ubuntu16.04下编译安装Autoware