PHP併發下讀寫檔案函式

2021-10-01 02:49:29 字數 1514 閱讀 2575

眾所周知,在高併發的狀態下,直接使用 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似乎工作的不是那麼好!在多併發情況下,似乎是經常...