2013-04-25 68 views
2

请问如何使用shmop(如果有的话,不是shm)在PHP中创建的共享内存被锁定和解锁?这是否需要库?如何在PHP中锁定共享内存(shmop)

看起来shmop_read()在shmop_write()仍在写入时运行,因为值读取具有旧值和新值的一部分。

回答

2

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

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

报价http://www.php.net/manual/en/function.shmop-open.php

“N”创建一个新的内存段(套IPC_CREATE | IPC_EXCL)当您想创建一个新的共享内存段使用该标志,但如果已经使用相同的存在国旗,失败。这对于安全目的很有用,使用它可以防止竞态条件的攻击。

+0

共享内存已创建。代码是修改它的内容。使用shmop_open($ shm_key,“n”,0644,100);将始终失败,因为共享内存已经创建。两段代码正在写入共享内存。如果其他人正在写作,他们之间如何被阻止? – MOHW 2013-04-25 12:21:02

+0

@Osofem在写入之后只是'shmop_close'段。那不会毁掉它。 – Gordon 2013-04-25 12:39:58

+0

这并不能解决问题。 @ljubiccica的链接只是启发了我,shmop_read正在拾取新旧值的一部分,这意味着在写入过程中仍然会调用read。 – MOHW 2013-04-25 12:55:17

0

我在PHP中发现了一些关于共享内存锁定的信息。

在这个页面上,用户声称已经非常成功地使用了“(...)mmcache的系统内存函数,它们抽象了所有困难的东西。” (link

而图尔克MMCache的页面上这样的: - 新的API函数mmcache_lock和mmcache_unlock实施了

turck-mmcache

应的php5支持。希望也许你可以从这里开始......

+0

这实际上是一个链接唯一的答案。 [我们不喜欢这些](http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers)。请包括链接的相关部分 – Gordon 2013-04-25 12:35:25

+0

我在这里有完全相同的问题... shmop_read正在撷取旧的和新的值的一部分。 – MOHW 2013-04-25 12:46:30

+0

尽管这里没有明显的解决方案... – MOHW 2013-04-25 12:52:19

1

我建议用sem_acquire,sem_release做原子操作。