眾所周知,在高併發的狀態下,直接使用 php 讀寫同乙個檔案時,可能會導致檔案內容丟失,於是乎就需要額外的**來解決這個問題。大致的思路是先使用flock
函式對原檔案進行鎖死,再來讀寫。
下面的這個函式是從大名鼎鼎的可道雲的**中找到的。可道雲相信大家都不會陌生,它是乙個無資料庫的程式,因此配置儲存全都是靠這個函式完成的,所以這段**的安全性和普適性絕對毋庸置疑,可以放心的用於專案中(注意盡量保留原作者的版權資訊就行了)。
不多說了,全部的**如下:
<?php
/*** @link
* @author warlee | e-mail:[email protected]
* @license tools/license/license.txt
*/ /**
* 安全讀取檔案,避免併發下讀取資料為空
* * @param $file 要讀取的檔案路徑
* @param $timeout 讀取超時時間
* @return 讀取到的檔案內容 | false - 讀取失敗
*/function file_read_safe($file, $timeout = 5)
}while ((!$locked) && ((microtime(true) - $starttime) < $timeout));
if ($locked && filesize($file) >= 0)
return $result;
} else }
/** * 安全寫檔案,避免併發下寫入資料為空
* * @param $file 要寫入的檔案路徑
* @param $buffer 要寫入的檔案二進位製流(檔案內容)
* @param $timeout 寫入超時時間
* @return 寫入的字元數 | false - 寫入失敗
*/function file_write_safe($file, $buffer, $timeout = 5)
if(!is_writeable($file)) return false; // 不可寫
// 在指定時間內完成對檔案的獨佔鎖定
$fp = fopen($file, 'r+');
$starttime = microtime(true);
do }
while ((!$locked) && ((microtime(true) - $starttime) < $timeout));
if ($locked)
@unlink($tempfile);
ftruncate($fp, 0);
rewind($fp);
$result = fwrite($fp, $buffer);
flock($fp, lock_un);
fclose($fp);
clearstatcache();
return $result;
} else
}
PHP讀寫檔案
php如何讀寫檔案 php讀寫檔案,就如同asp中使用fso進行檔案的讀寫操作。當然在asp中fso僅對於執行當前程式的伺服器磁碟上檔案進行讀寫 很明顯就是需要獲得物理路徑 然而php可以通過ftp或http開啟檔案進行讀寫。一,php如何讀取檔案 php讀取檔案可以讀取當前伺服器或遠端伺服器中的檔...
PHP讀寫檔案
一 讀取檔案 例1 xml 開啟檔案 迴圈讀取檔案的全部內容,每次讀取4096個字元 while data fread f,4096 關閉乙個開啟檔案 fclose f 例2 讀取xml檔案,用php正規表示式來記取資料 xml f fopen person.xml r while data fre...
php中併發讀寫檔案衝突的解決方案
在這裡提供4種高併發讀寫檔案的方案,各有優點,可以根據自己的情況解決php併發讀寫檔案衝突的問題。複製 如下 fp fopen tmp lock.txt w if flock fp,lock ex else fclose fp 但在php中,flock似乎工作的不是那麼好!在多併發情況下,似乎是經常...