在網上看到一道題,是這樣問的,「寫個函式來解決多執行緒同時讀寫乙個檔案的問題
上邊給的答案是:flock($hander,lock_ex)
這個我想了下,感覺很不解,flock鎖住當前檔案時(第乙個程序還未寫入完),當下乙個程序訪問的時候就能寫入了麼?所以做了下測試
寫了兩個檔案
demo.php
<?
php$fp
=fopen('
asn.php',
'w+');
flock
($fp
,lock_ex);
sleep(10
);flock
($fp
,lock_un);
fclose
($fp
);?>
demo1.php
$fp=
fopen('
asn.php',
'w+');
fwrite
($fp,'
writeok!');
fclose
($fp);
先執行,demo.php, 然後執行demo1.php,發現不能插入,所以依然質疑這個答案。
以前其實也遇到過這個問題,是個簡訊投票的介面,用了個不太主流的方法,當時也沒出什麼問題,可能是沒到出錯的量級吧。
function
add_num(
$file_path
,$messageid
,$num)//
為防止併發寫入檔案錯誤,判斷乙個檔案是否存在,若存在證明正在插入,進入死迴圈,否則直接插入
touch
($file_path_user.'
/no_writable');
//新建驗證檔案
file_put_contents
( $file_path_user.'
/num.txt',
intval
(file_get_contents
($file_path_user.'
/num.txt
'))
+$num
); //
增加票數
unlink
($file_path_user.'
/no_writable');
//刪除驗證檔案}
這個方法用個新檔案來標記是否插入完成,如果完成就插入正常插入下一條,如果沒完成則進入死迴圈,這個需要把php檔案的執行時間調高點(怕你插入的三國演義那種大東東,下乙個程序會因為這個程序沒結束而直至進行到php設定的最大執行時間而報錯)
乙個朋友說,可以在記憶體裡做個標記,來替換掉檔案標記,但試了半天不知道用什麼方法實現。
希望那位知道的大俠回個可用的方法。我知道後也會更新此貼!
Unity C 多執行緒同時寫入乙個檔案
unity c 多執行緒同時寫入乙個檔案 threadfilewriter是乙個unity下可以多執行緒對檔案進行寫入的框架。當我們在unity的多執行緒中要除錯一些問題的時候,需要寫入檔案檢視問題在哪。比如網路問題,這個時候在主線程下就無法將資訊很好的列印出來。這就誕生了threadfilewri...
多個檔案寫入到乙個檔案裡
其中類的操作參看clscomposefiles這個類,而檔案索引結構參看fileindex這個structure。namespace composefiles get file name byte bfilename encoding.unicode.getbytes fi.name write f...
Linux下多個程序或執行緒同時對乙個檔案進行寫操作
linux下多個程序或執行緒同時對乙個檔案進行寫操作 linux下多個程序或執行緒同時對乙個檔案進行寫操作,如何解決衝突?使用flock 鎖定檔案或解除鎖定 簡單可行!先介紹一下flock函式吧 標頭檔案 include 定義函式 int flock int fd,int operation 函式說...