2 回答

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, 取模結果與此進程的序號相等就讀取內容并處理,不相等就跳過

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的開銷。
- 2 回答
- 0 關注
- 124 瀏覽
添加回答
舉報