2013-03-08 71 views
4

在我的php代碼中,我想創建一個讀寫器代碼。所以會有一個php代碼會讀取或寫入的文件。只能有一個作家,或者可以有很多讀者,但是你可以同時書寫和閱讀。如何在PHP中使用羣集?

這怎麼可以在PHP中完成?我相信你需要使用flock的代碼?

+2

你想知道什麼不在第一個例子涵蓋http://au1.php.net/manual/en/function.flock.php – Danack 2013-03-08 23:51:39

回答

8

我與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()來關注鎖定。但是你不能確定另一個進程 - 如文本編輯器 - 不會覆蓋你的文件

+0

這個代碼是否允許多人從文件在同一時間?另外,如何在開始寫入之前檢測文件是否正在讀取? – omega 2013-03-08 23:58:44

+0

@omega是的,允許其他進程讀寫文件(!)。他們可能無法獲得鎖定。以前不知道 – hek2mgl 2013-03-09 00:16:38

+0

@omega檢查我的更新 – hek2mgl 2013-03-09 00:27:54

0

如果你想同時讀寫,那麼你不能。這是不安全的行爲。只需使用獨佔鎖來寫入,並且您的讀者(使用共享鎖)將在等待讀取時阻塞。這樣他們永遠無法從零件完成的文件中讀取數據,但總是能夠最終讀取。

哦,不要鎖定文件的時間超過您的需要。如果您要進行長時間的更改(例如等待網絡活動),請鎖定它,更新,解鎖,等待,直到獲得更多數據,鎖定它,更新,解鎖。或者更好的是,內部緩衝數據並一次寫入。