请写一段 PHP 代码 ,确保多个进程同时写入同一个文件成功
方案一:
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); //判斷是否等于最大重試次數,是則返回falseif ($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 平臺上)。
參數
handle文件系統指針,是典型地由?fopen()?創建的?resource(資源)。
operation?可以是以下值之一:
- LOCK_SH取得共享鎖定(讀取的程序)。
- LOCK_EX?取得獨占鎖定(寫入的程序。
- LOCK_UN?釋放鎖定(無論共享或獨占)。
如果不希望?flock()?在鎖定時堵塞,則是?LOCK_NB(Windows 上還不支持)。
如果鎖定會堵塞的話(EWOULDBLOCK 錯誤碼情況下),可選的第三個參數會被設置為?TRUE。(Windows 上不支持)
返回值
成功時返回?TRUE, 或者在失敗時返回?FALSE。
Example #1?flock()?例子
<?php$fp = fopen("/tmp/lock.txt", "r+");if (flock($fp, LOCK_EX)) { // 進行排它型鎖定ftruncate($fp, 0); // truncate filefwrite($fp, "Write something here\n");fflush($fp); // flush output before releasing the lockflock($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
來源:http://www.cnblogs.com/gengyi/p/6399206.html
總結
以上是生活随笔為你收集整理的请写一段 PHP 代码 ,确保多个进程同时写入同一个文件成功的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 镇江市各小区物业费收费标准到哪里查询
- 下一篇: Web项目性能优化之减少HTTP请求次数