當file_put_contents
嘗試上鎖定的文件寫等待,直到該文件被解鎖,然後執行寫並返回寫入的字節數。
證明:
我寫了一個簡單的兩腳本測試:
第一個腳本寫了一個100MB的文件(一個緩慢的USB2連接的驅動器上);
第二個腳本將一個短字符串附加到同一個文件中。
的核心的兩個腳本是這四行:
echo Milliseconds() . ": Start writing file on file\n";
$bytesCount = file_put_contents("/Volumes/myHD/somefile.txt", $buffer, FILE_APPEND | LOCK_EX);
var_export($bytesCount);
echo "\n" . Milliseconds() . ": Done writing on file\n";
哪裏Milliseconds()
是返回以毫秒爲單位的當前Unix時間戳功能。
在第一腳本$buffer
是100MB串,在第二腳本$buffer = "MORE-DATA\n";
運行第一腳本和快速啓動第二個結果在這樣的輸出:
腳本1:
$ php test1.php
1481892766645: Start writing file on file
100000000
1481892769680: Done writing on file
$
腳本2:
$ php test2.php
1481892766831: Start writing file on locked file
10
1481892769909: Done writing file on locked file
$
需要注意的是:
檢查結果之後寫入229毫秒後這兩個腳本終止執行:
$ stat -f%z /Volumes/myHD/somefile.txt
100000010
$
+ 10個字節被寫入10MB
$ tail -c 20 /Volumes/myHD/somefile.txt
MORE-DATA
$
第二個sc RIPT實際上是在文件的末尾附加字符串
如果你有多個進程(PHP應用程序),它們使用相同的'file_get_contents'寫入文件,你可以傳遞參數:'LOCK_EX',這是獲得在進行寫作時對文件進行獨佔鎖定。換句話說,在fopen()調用和fwrite()調用之間發生flock()調用。這與使用模式「x」的fopen()調用不同。 –
你已經在做它。如果它不能寫入文件(另一個進程正在使用它),則失敗。 Coz,該函數返回寫入文件的字節數,或返回失敗時的FALSE。 –