方案一:
function writeData($filepath, $data) { $fp = fopen($filepath,'a'); do{ usleep(100); }while (!flock($fp, LOCK_EX)); $res = fwrite($fp, $data."\n"); flock($fp, LOCK_UN); fclose($fp); return $res; }
本文出自 “我知” 博客,請務必保留此出處http://iknow.blog.51cto.com/6209466/1058876
方案二:
function writeData($path, $mode,$data,$max_retries = 10) { $fp = fopen($path, $mode); $retries = 0; do{ if ($retries > 0) { usleep(rand(1, 10000)); } $retries += 1; }while (!flock($fp, LOCK_EX) and $retries<= $max_retries); //判斷是否等於最大重試次數,是則返回false if ($retries == $max_retries) { return false; } fwrite($fp, "$data "); flock($fp, LOCK_UN); fclose($fp); return true; }
來自http://www.xuejiehome.com/blread-1670.html
方案三:
function write_file($filename, $content) { $lock = $filename . '.lck'; $write_length = 0; while(true) { if( file_exists($lock) ) { usleep(100); } else { touch($lock); $write_length = file_put_contents($filename, $content, FILE_APPEND); break; } } if( file_exists($lock) ) { unlink($lock); } return $write_length; }
flock
(PHP 4, PHP 5, PHP 7)
flock — 輕便的咨詢文件鎖定
bool flock ( resource $handle , int $operation [, int &$wouldblock ] )
flock() 允許執行一個簡單的可以在任何平台中使用的讀取/寫入模型(包括大部分的 Unix 派生版和甚至是 Windows)。
在 PHP 5.3.2版本之前,鎖也會被 fclose() 釋放(在腳本結束后會自動調用)。
PHP 支持以咨詢方式(也就是說所有訪問程序必須使用同一方式鎖定, 否則它不會工作)鎖定全部文件的一種輕便方法。 默認情況下,這個函數會阻塞到獲取鎖;這可以通過下面文檔中 LOCK_NB
選項來控制(在非 Windows 平台上)。
Example #1 flock() 例子
<?php
$fp = fopen("/tmp/lock.txt", "r+"); if (flock($fp, LOCK_EX)) { // 進行排它型鎖定 ftruncate($fp, 0); // truncate file fwrite($fp, "Write something here\n"); fflush($fp); // flush output before releasing the lock flock($fp, LOCK_UN); // 釋放鎖定 } else { echo "Couldn't get the lock!"; } fclose($fp); ?>
Example #2 flock() 使用 LOCK_NB
選項
<?php
$fp = fopen('/tmp/lock.txt', 'r+'); /* Activate the LOCK_NB option on an LOCK_EX operation */ if(!flock($fp, LOCK_EX | LOCK_NB)) { echo 'Unable to obtain lock'; exit(-1); } /* ... */ fclose($fp); ?>
Note:
由於 flock() 需要一個文件指針, 因此可能不得不用一個特殊的鎖定文件來保護打算通過寫模式打開的文件的訪問(在 fopen() 函數中加入 "w" 或 "w+")。
Warning:
在部分操作系統中 flock() 以進程級實現。當用一個多線程服務器 API(比如 ISAPI)時,可能不可以依靠 flock() 來保護文件,因為運行於同一服務器實例中其它並行線程的 PHP 腳本可以對該文件進行處理。
flock() 不支持舊的文件系統,如 FAT 以及它的派生系統。因此,此環境下總是返回 FALSE
(尤其是對 Windows 98 用戶來說)。
http://php.net/manual/zh/function.flock.php
轉自:https://www.cnblogs.com/gengyi/p/6399206.html