2011-03-27 57 views
5

我有一個新人(隔壁的少年)寫一些php代碼來跟蹤我的網站上的一些用法。我對PHP不熟悉,所以我想問一下關於併發文件訪問的問題。文件鎖定在PHP

我的本地應用程序(在Windows上)偶爾會通過點擊包含我的php腳本的URL將一些數據記錄到我的網站。本機應用程序不檢查返回的數據。

 $fh = fopen($updateFile, 'a') or die("can't open file"); 
     fwrite($fh, $ip); 
     fwrite($fh, ', '); 
     fwrite($fh, $date); 
     fwrite($fh, ', '); 
     fwrite($fh, implode(', ', $_GET)); 
     fwrite($fh, "\r\n"); 
     fclose($fh); 

這是一個低流量的網站,數據並不重要。但是如果兩個用戶發生衝突並且腳本的兩個實例都嘗試向該文件添加一行,會發生什麼情況?有沒有在PHP中隱式文件鎖定?

上面的代碼是否至少安全無法鎖定並永遠不會將控制權返回給我的用戶?該文件可能被破壞?如果我有上面的腳本每個月刪除文件,如果腳本的另一個實例正在寫入文件中,會發生什麼情況?

回答

9

你應該把該文件鎖:

<?php 
$fp = fopen($updateFile, 'w+'); 
if(flock($fp, LOCK_EX)) { 
fwrite($fp, 'a'); 
flock($fp, LOCK_UN); 
} else { 
echo 'can\'t lock'; 
} 

fclose($fp); 
+0

正是我在找的,雷蒙德。謝謝。從我剛剛完成的其他閱讀(http://www.tuxradar.com/practicalphp/8/11/0),看起來可能永遠不會達到echo-statement。在第一個進程解鎖文件之前,第二個進程是否會阻止羣集調用?羊羣不需要OR LOCK_NB以便能夠達到回聲聲明嗎? – RobertFrank 2011-03-27 14:36:45

+0

我本來希望得到何先生或其他人的迴應,我的觀察是否會達到上述回聲。 – RobertFrank 2011-03-30 12:00:05

+4

是的,你需要在代碼中使用'| LOCK_NB',否則如果鎖已經被鎖定,鎖就會被鎖住:) – cweiske 2011-05-07 10:37:12

3

因爲這是一個附加到文件,最好的辦法是彙總數據,並在一個FWRITE寫入文件()提供要寫入的數據並不比文件緩衝區大。當然,你並不總是知道緩衝區的大小,所以flock();總是一個不錯的選擇。

+0

我會做兩個:保持寫入一個'fwrite()'*和*鎖定文件。在一些Linux平臺和一些較舊的文件系統上,'flock()'可能實際上不鎖定文件。 – Jason 2015-10-27 12:34:18