Apache2启动后如何在其PHP上下文执行脚本初始化全局互斥锁?
Apache2+PHP8.0下全局互斥锁模块的初始化同步问题
环境与开发目标
- 运行环境:树莓派(Raspbian 11)、Apache2服务器、PHP 8.0
- 开发任务:基于PHP内置
flock函数实现自定义服务端mutex模块,提供mutex_lock($name)和mutex_unlock($name)两个函数,简化多请求间的全局互斥锁使用
mutex_lock($name)的实现逻辑
利用$GLOBALS变量在会话间的持久化特性,存储文件资源供所有请求共享,具体步骤:
- 定义
$GLOBALS['mresources']为关联数组,用于存储锁对应的文件资源 - 检查目标锁对应的资源是否存在:
- 若
$GLOBALS['mresources'][$name]已定义,直接复用该文件资源 - 若未定义,创建新文件资源并存入全局变量:
$file = fopen(path($name), "w+"); $GLOBALS['mresources'][$name] = $file;
- 若
- 调用
flock($resource, LOCK_EX)对文件资源加阻塞式排他锁,实现互斥
现存并发问题
- 多线程场景下,线程A检查
$GLOBALS['mresources']时,线程B可能同时完成赋值操作,导致线程A重复创建资源并覆盖已存储的引用,造成资源丢失 - 多个请求同时检查同一
$GLOBALS['mresources'][$name]不存在时,会同时尝试创建资源并赋值,无法保证对全局变量的同步访问
需求与困境
当前陷入循环:解决上述并发问题需要依赖互斥锁,但互斥锁模块本身正处于开发阶段。
希望实现:在Apache2启动并完成PHP实例初始化后、处理客户端请求前,执行一段PHP脚本,在Apache2的PHP上下文中创建全局互斥锁,用于同步对$GLOBALS['mresources']的访问,避免重复创建文件资源和意外覆盖。目前仅找到修改启动脚本运行独立PHP进程的方法,但这并非同一PHP上下文,求可行的实现方案。(注:暂不考虑全局变量使用不规范的问题)
内容的提问来源于stack exchange,提问作者Carl HR
相关产品推荐
相关产品推荐

