2013-04-25 69 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做原子操作。