多個執行緒同時寫入乙個檔案問題 php

2021-06-04 08:19:28 字數 1376 閱讀 9753

在網上看到一道題,是這樣問的,「寫個函式來解決多執行緒同時讀寫乙個檔案的問題

上邊給的答案是: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 函式說...