如何在php(shmop)中锁定共享内存

如何在php(shmop)中锁定共享内存,php,Php,请问如何锁定和解锁使用shmop在PHP中创建的共享内存?这需要图书馆吗 shmop_read()似乎在shmop_write()仍在写入时运行,因为值read包含部分新旧值。您无法明确锁定共享内存段,但可以以独占模式打开它,例如 shmop_open($shm_key, "n", 0644, 100); 引用 “n”创建一个新的内存段(设置IPC|U create | IPC|U EXCL)当您想要创建一个新的共享内存段时,使用此标志,但如果已经存在一个具有相同标志的共享内存段,则失败。这对

请问如何锁定和解锁使用shmop在PHP中创建的共享内存?这需要图书馆吗


shmop_read()似乎在shmop_write()仍在写入时运行,因为值read包含部分新旧值。

您无法明确锁定共享内存段,但可以以独占模式打开它,例如

shmop_open($shm_key, "n", 0644, 100);
引用

“n”创建一个新的内存段(设置IPC|U create | IPC|U EXCL)当您想要创建一个新的共享内存段时,使用此标志,但如果已经存在一个具有相同标志的共享内存段,则失败。这对于安全目的很有用,使用它可以防止竞争条件漏洞攻击


我在PHP中找到了一些关于共享内存锁定的信息

在这一页上,用户声称已经非常成功地使用了mmcache的系统内存功能。它们提取了所有困难的东西

在Turck MMCache的页面上: -实现了新的API函数mmcache_lock和mmcache_unlock


应该支持Php5。希望您可以从这里开始…

我建议使用
sem\u acquire
sem\u release
执行原子操作。

共享内存已经创建。代码用于修改其内容。使用shmop_open($shm_键,“n”,0644100);将始终失败,因为共享内存已创建。两段代码正在写入共享内存。如果其中一个正在写入,如何阻止另一个?@Osofem在写入后关闭该段。这不会破坏它,也不能解决问题。@Ljubiccia的链接正好启发了我,shmop_read正在提取部分旧值和新值,这意味着read是在write仍在进行时调用的。@这就是为什么您应该用“n”打开它。当您将其写入时,没有其他进程可以打开它。然后你把它关上。在其他位置打开共享内存并从中读取。在共享内存已存在且带有“n”的情况下创建或打开共享内存将失败,因此不适用。这是一种情况,分为三个部分。第一节打开/创建共享内存段并写入/更新其内容。第二节更新已经写入段中的内容,而第三节读取段中的内容。这些部分中的任何一个都可以随时运行。在第1节和第2节中使用“n”打开它将不起作用,因为该段已经存在!这实际上是一个仅链接的答案。请包括链接的相关部分与我在这里遇到的问题完全相同。。。shmop_read正在收集新老价值观的一部分。是的,Gordon和Osofem,我同意你们的观点。我是新来的,我想帮忙。就在昨天,我才知道我可以对问题发表评论,这可能就是这件事的归属。如果你认为这些信息有误导性,我可以删除我的答案。KR@ljubiccica你可以删除答案,或者最好从链接的网站上引用相关内容。