在我的php代碼中,我想創建一個讀寫器代碼。所以會有一個php代碼會讀取或寫入的文件。只能有一個作家,或者可以有很多讀者,但是你可以同時書寫和閱讀。如何在PHP中使用羣集?
這怎麼可以在PHP中完成?我相信你需要使用flock
的代碼?
在我的php代碼中,我想創建一個讀寫器代碼。所以會有一個php代碼會讀取或寫入的文件。只能有一個作家,或者可以有很多讀者,但是你可以同時書寫和閱讀。如何在PHP中使用羣集?
這怎麼可以在PHP中完成?我相信你需要使用flock
的代碼?
我與Danack's comment - 的flock()
的php documentation包含一個很好的例子:
$fp = fopen("/tmp/lock.txt", "r+");
if (flock($fp, LOCK_EX)) { // exclusive lock will blocking wait until obtained
fwrite($fp, "Write something here\n");
// or ...
execute_code_that_shouldnt_run_twice_at_the_same_time();
flock($fp, LOCK_UN); // unlock
} else {
echo "failed to obtain lock";
}
fclose($fp);
注意flock()
在默認模式下會阻塞等待,直到它可以獲得鎖。如果其他進程當前獲得鎖定,則情況就是這樣。
但是,不要指望從flock()
功能太多。它正在使用所謂的諮詢鎖,這可以被其他進程忽略。在Linux例如PHP的flock()
正在使用內核函數flock()
,man 2 flock
解釋它是如何工作的:
羊羣()只放在諮詢鎖;給予 文件的適當權限,進程可以忽略使用flock()並在文件上執行 上的I/O。
含義flock()
只會給其他進程的建議。如果他們不關心他們可以讀取甚至寫入,而不管鎖(或鎖的類型)如何。然而,手冊頁是關於Linux的其他系統可能會以不同的方式處理。 (實際情況並非如此)
但是,由於您是進程的編碼器,因此每次訪問文件時都可以使用flock()
來關注鎖定。但是你不能確定另一個進程 - 如文本編輯器 - 不會覆蓋你的文件
如果你想同時讀寫,那麼你不能。這是不安全的行爲。只需使用獨佔鎖來寫入,並且您的讀者(使用共享鎖)將在等待讀取時阻塞。這樣他們永遠無法從零件完成的文件中讀取數據,但總是能夠最終讀取。
哦,不要鎖定文件的時間超過您的需要。如果您要進行長時間的更改(例如等待網絡活動),請鎖定它,更新,解鎖,等待,直到獲得更多數據,鎖定它,更新,解鎖。或者更好的是,內部緩衝數據並一次寫入。
你想知道什麼不在第一個例子涵蓋http://au1.php.net/manual/en/function.flock.php – Danack 2013-03-08 23:51:39