首页 > 解决方案 > PHP 的名为 mutexes 的 SyncMutex 类是否可以跨同一服务器上的不同进程工作?

问题描述

背景

我正在使用 Apache 和 PHP 构建一个 Web 应用程序,我需要同步对共享内存区域的访问。由于 PHP 的不同实例有不同的进程 ID,我想知道 PHP 的 SyncMutex 类与命名互斥锁是否可以用于此。在 Google 搜索中,我看到了很多关于将文件用作互斥锁的信息,但对于 SyncMutex 类来说却不多。除了类的定义和一些关于如何使用它的示例之外,甚至手册也没有更多的信息。

问题

一个进程中名为 mutex 的 SyncMutex 类在另一个进程中是否可见?

研究

https://helperbyte.com/questions/470561/how-to-prevent-simultaneous-running-of-a-php-script

PHP互斥(mutex)

PHP 重写一个包含的文件 - 这是一个有效的脚本吗?

在 PHP 中防止竞争条件的最可靠和安全的方法

最后

所涉及的数据是非常短暂的,并且可以随时更改(想想 C 中的 volatile 关键字)。数据在 30 秒左右后变得无用,并定期清除。出于性能原因,我将它存储在服务器的共享内存中,访问速度比写入文件或数据库要快得多。这是一个有效的用例还是我叫错了树?我应该使用其他东西吗?像信号量?

附加信息(2021 年 8 月 25 日编辑)

经过进一步研究,我发现 PHP 的 pthreads 模块在几个月前已被模块所有者贬低,不再维护。PHP 现在使用称为并行的东西来促进多线程。由于我正在使用的设置设计,并行与我正在尝试做的事情不兼容。所以看起来我现在必须使用 MySQL 来处理这个问题。

我使用内存服务器的想法仍然可行,但是由于 PHP 的多线程架构发生了变化,服务器需要用 PHP 以外的语言编写。这将使用 C++ 完成,但不是现在。

感谢所有回复的人。

标签: phpmutexphp-7

解决方案


根据SyncMutex::unlock文档页面下方用户提供的示例,在一个进程中创建的 SyncMutex 锁在另一个进程中可见。

此外SyncSharedMemory类描述明确表示:

共享内存允许两个独立的进程进行通信,而不需要复杂的管道或套接字。[...] 仍然需要同步对象(例如 SyncMutex)来保护大多数共享内存的使用。


推荐阅读