能,但仅限同一文件、同一进程组且正确调用时有效;它是建议性锁,依赖所有进程主动配合,不跨文件、不跨语言、在nfs等网络文件系统中可能失效。
PHP 用 flock() 锁文件真的能防并发写入吗
能,但只在「同一文件、同一进程组、正确调用」的前提下有效。它不是全局锁,不跨文件生效,也不阻塞其他语言或未调用 flock() 的 PHP 进程。常见误用是以为加了 flock() 就万事大吉,结果多个请求仍写乱数据。
关键点:
-
flock()是 advisory lock(建议性锁),依赖所有参与者主动配合 —— 没调用它,就完全无视这个锁 - 必须在
fopen()后、任何读写前加锁;锁在fclose()或脚本结束时自动释放 - 不能对已关闭的文件句柄调用
flock(),否则返回false且无警告 - 网络文件系统(如 NFS)下
flock()可能失效,不推荐用于 NAS 或容器共享卷
创建文件前先锁定目标路径的正确姿势
很多人想“锁住一个路径”,但 flock() 只作用于打开的文件句柄,无法锁定路径本身。所以标准做法是:先打开一个**固定存在的锁文件**(如 app.lock),再对其加锁,之后才操作目标文件(如生成 data_20241105.json)。
示例流程:
立即学习“PHP免费学习笔记(深入)”;