亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請問有什么更好的方式可以給文件加 讀鎖?因為,只需要讀文件。

請問有什么更好的方式可以給文件加 讀鎖?因為,只需要讀文件。

PHP
大話西游666 2023-04-18 19:15:02
有大量文件需要處理。用一個php進程去操作會很慢。如何在一個進程讀某一個文件的時候,把文件鎖上。不讓其他進程可以再讀而直接跳過,繼續讀其他的?把正在讀得文件rename,讀完之后再rename回來,效率挺低的。如果實在沒有更好的方法,就只能用這個了。flock,測試了一下,貌似不太好用,試了一下,沒實現文件的非阻塞讀鎖。給不同進程分配不同的文件,不好實現。也沒數據庫。就算有。用數據庫做鎖,貌似比rename更低效。
查看完整描述

2 回答

?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

你的問題是:
1. 很多文件,想多進程處理,以提高效率,縮短總處理時間
2. 這些進程只需要讀文件,不需要寫
3. 對每個文件,只要有一個進程處理過它就可以了,沒有多個進程都必須處理它的需求

你的需求其實是分治,將文件分為多個組(不一定要在文件系統上新建目錄),然后分而治之,這種情況不需要用鎖.

鎖不是用于這種場景的,鎖用于下面這種場景:

1. 文件file.txt里面記錄了user1的銷售額和user2的銷售額,user1+user2的銷售總額
2. 進程php1負責寫入user1的數據,進程php2負責寫入user2的數據,兩個進程各讀出銷售總額顯示給user1,user2
3. user1和user2同時要求寫入,真的是同時,不是前后差個幾秒什么的

建議你這樣解決:
1. 啟動多個PHP進程(nohup php your_script.php your_dir &)
2. 每個PHP進程賦予一個序號(假設4個進程,那就0,1,2,3),可以通過對進程自身的pid模運算取余數得到,也可以在啟動進程的時候通過命令行傳入,隨你了
3. 每個進程在處理文件前先對文件名做crc32()運算,模一下進程總數: crc32(file_name) % 4, 取模結果與此進程的序號相等就讀取內容并處理,不相等就跳過


查看完整回答
反對 回復 2023-04-22
?
繁星點點滴滴

TA貢獻1803條經驗 獲得超3個贊

用memcached實現吧。

比如讀取文件 $filename = "t.txt";

if(!$memcached->get($filename)){   //文件鎖不存在,那么執行文件讀取功能   //首先再將文件鎖住,   $memcaced->save($filename,'1');   $fs = fopen($filename,'r+');
   
   fclose($fs);   //讀取完畢釋放文件鎖   $memcaced->delete($filename);
}else{   // 文件鎖已經存在,跳過
   
}

以上是 memcaced 純內存操作,速度會很快,根本不要考慮到性能的問題,當然還有一種方法,采用真正的文件鎖,即添加一個新文件的方法控制,文件爭用,但是此方法將加大IO的開銷。


查看完整回答
反對 回復 2023-04-22
  • 2 回答
  • 0 關注
  • 124 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號