請寫一段 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); //判斷是否等於最大重試次數,是則返回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 平台上)。

參數

handle

文件系統指針,是典型地由 fopen() 創建的 resource(資源)。

operation

operation 可以是以下值之一:

  • LOCK_SH取得共享鎖定(讀取的程序)。
  • LOCK_EX 取得獨占鎖定(寫入的程序。
  • LOCK_UN 釋放鎖定(無論共享或獨占)。

如果不希望 flock() 在鎖定時堵塞,則是 LOCK_NB(Windows 上還不支持)。

wouldblock

如果鎖定會堵塞的話(EWOULDBLOCK 錯誤碼情況下),可選的第三個參數會被設置為 TRUE。(Windows 上不支持)

返回值

成功時返回 TRUE, 或者在失敗時返回 FALSE

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM