请问如何使用shmop(如果有的话,不是shm)在PHP中创建的共享内存被锁定和解锁?这是否需要库?如何在PHP中锁定共享内存(shmop)
看起来shmop_read()在shmop_write()仍在写入时运行,因为值读取具有旧值和新值的一部分。
请问如何使用shmop(如果有的话,不是shm)在PHP中创建的共享内存被锁定和解锁?这是否需要库?如何在PHP中锁定共享内存(shmop)
看起来shmop_read()在shmop_write()仍在写入时运行,因为值读取具有旧值和新值的一部分。
您无法明确地锁定共享内存段,但可以在独占模式下打开它,例如,
shmop_open($shm_key, "n", 0644, 100);
报价http://www.php.net/manual/en/function.shmop-open.php
“N”创建一个新的内存段(套IPC_CREATE | IPC_EXCL)当您想创建一个新的共享内存段使用该标志,但如果已经使用相同的存在国旗,失败。这对于安全目的很有用,使用它可以防止竞态条件的攻击。
我在PHP中发现了一些关于共享内存锁定的信息。
在这个页面上,用户声称已经非常成功地使用了“(...)mmcache的系统内存函数,它们抽象了所有困难的东西。” (link)
而图尔克MMCache的页面上这样的: - 新的API函数mmcache_lock和mmcache_unlock实施了
应的php5支持。希望也许你可以从这里开始......
我建议用sem_acquire
,sem_release
做原子操作。
共享内存已创建。代码是修改它的内容。使用shmop_open($ shm_key,“n”,0644,100);将始终失败,因为共享内存已经创建。两段代码正在写入共享内存。如果其他人正在写作,他们之间如何被阻止? – MOHW 2013-04-25 12:21:02
@Osofem在写入之后只是'shmop_close'段。那不会毁掉它。 – Gordon 2013-04-25 12:39:58
这并不能解决问题。 @ljubiccica的链接只是启发了我,shmop_read正在拾取新旧值的一部分,这意味着在写入过程中仍然会调用read。 – MOHW 2013-04-25 12:55:17