














1、文件锁
flock()是一个用于对文件进行轻量级、跨平台的协同锁定(Advisory Locking)的函数。主要用于防止多个进程同时对一个文件进行读写操作,从而避免竞争和文件损坏。
(1)、LOCK_SH(共享锁):用于读取操作,允许多个进程同时持有共享锁进行读取,但会阻塞其他进程获取独占锁。
(2)、LOCK_EX(独占锁):用于写入操作,确保同一时间只有一个进程可以写入文件,其它进程无论读写都会被阻塞。
(3)、LOCK_UN(释放锁):手动释放当前持有的共享锁或独占锁。
(4)、LOCK_NB(非阻塞模式):这是一个掩码,可以加在上述锁之上(如LOCK_EX | LOCK_NB)。加上后,如果无法立即获取锁,函数会直接返回FALSE而不是阻塞等待。
注:在使用flock()时,要特别注意
(1)、必须手动释放锁:自PHP5.32起,flose()不再自动释放文件锁,必须显式调用flock($fp,LOCK_UN)
(2)、协同锁的限制:flock() 是协同锁,这意味着只有所有访问该文件的程序都使用 flock() 时,锁才会生效。如果其他程序(如系统命令 cat、echo)绕过 flock() 直接写入文件,锁将无法阻止它们。
(3)、进程级而非线程级:文件锁是进程级别的。在某些多线程服务器 API(如 ISAPI)下,同一服务器实例的不同线程可能无法被 flock() 正确隔离。
(4)、文件系统限制:flock() 不支持某些过时的文件系统(如 FAT 及其衍生系统),也不支持 NFS 等网络文件系统,在这些环境下会始终返回 FALSE。
(5)、截断文件时的特殊处理:如果你打算以写入模式("w" 或 "w+")打开文件并截断它,建议在加锁前先打开文件,或者使用一个专门的锁文件(Lock File)来控制访问,防止在获取锁之前文件内容已被清空。
2、数据库悲观锁
3、Redis分布式锁
4、消息队列异步处理(秒杀防超卖)
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。