0

0

php文件锁机制怎用改_php文件锁机制使用修改法【互斥】

蓮花仙者

蓮花仙者

发布时间:2026-02-08 01:19:17

|

484人浏览过

|

来源于php中文网

原创

PHP文件锁用flock()实现互斥写入,需先fopen()再flock(LOCK_EX),所有IO必须经该文件指针,file_put_contents的LOCK_EX仅保证单次写入原子性,无法保护“读-改-写”多步操作。

php文件锁机制怎用改_php文件锁机制使用修改法【互斥】

PHP 文件锁怎么实现互斥写入

flock() 最直接,但必须注意它默认是阻塞的,且只对同一文件句柄有效——不是“全局锁”,而是“当前进程+当前打开的文件流”级别的协作式锁。

  • 必须先用 fopen() 打开文件(哪怕只是 'r' 模式),再调用 flock(),不能对路径字符串直接加锁
  • 加锁后所有读写操作都得通过该文件指针进行,file_put_contents($path, $data) 这类函数会绕过锁,导致失效
  • 解锁靠 flock($fp, LOCK_UN) 或脚本结束时自动释放(但别依赖自动释放,尤其在 long-running 进程中)

flock() 的 LOCK_EX 和 LOCK_SH 区别在哪

LOCK_EX 是排他锁(写锁),同一时间只允许一个进程持有;LOCK_SH 是共享锁(读锁),多个进程可同时持有,但只要有 LOCK_EX 在,LOCK_SH 就会阻塞。

  • 想保证写入不被并发覆盖 → 用 LOCK_EX
  • 只是读取、又希望避免读到写到一半的脏数据 → 可配合 LOCK_SH,但需写方也主动用 LOCK_EX,否则读锁没意义
  • 加锁失败时 flock() 返回 false,不是抛异常,记得判断

为什么 file_put_contents(..., LOCK_EX) 不够用

file_put_contents($path, $data, LOCK_EX) 确实会内部调用 flock(),但它只锁住“这次写入”的瞬间:打开→加锁→写入→关闭。整个过程极短,无法覆盖“读-改-写”这类多步操作。

ChatGPT Website Builder
ChatGPT Website Builder

ChatGPT网站生成器,AI对话快速生成网站

下载
  • 比如:读出 JSON → 解码 → 修改某个字段 → 编码 → 写回。这四步之间没有锁保护,其他进程可能在中间插入写入
  • 这种场景必须手动用 fopen()+flock()+fwrite()+fclose() 把整段逻辑包住
  • LOCK_EX 标志位对 file_put_contents() 是“一次性原子写”,不是“会话级锁”

文件锁失效的常见坑

最典型的是 NFS 或某些容器挂载卷上 flock() 不生效——因为 POSIX 文件锁在部分网络文件系统上被禁用或模拟不完整。

立即学习PHP免费学习笔记(深入)”;

  • 测试方法:起两个终端,分别运行带 flock() 的脚本,看是否真能互斥
  • Linux 下可通过 strace -e trace=flock php script.php 确认系统调用是否成功
  • 如果环境不可靠,得降级用目录锁(mkdir() 原子性)或外部服务(Redis SETNX)
文件锁的“互斥”完全依赖协作,没人强制你加锁;而一旦涉及跨存储、跨语言或长事务,它的边界就很容易被忽略。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

431

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

542

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

314

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

79

2025.09.10

fclose函数的用法
fclose函数的用法

fclose是一个C语言和C++中的标准库函数,用于关闭一个已经打开的文件,是文件操作中非常重要的一个函数,用于将文件流与底层文件系统分离,释放相关的资源。更多关于fclose函数的相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

334

2023.11.30

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

424

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1515

2023.10.24

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

39

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 11.2万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号