請問如何使用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