2 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超4個(gè)贊
你的問題是:
1. 很多文件,想多進(jìn)程處理,以提高效率,縮短總處理時(shí)間
2. 這些進(jìn)程只需要讀文件,不需要寫
3. 對(duì)每個(gè)文件,只要有一個(gè)進(jìn)程處理過它就可以了,沒有多個(gè)進(jìn)程都必須處理它的需求
你的需求其實(shí)是分治,將文件分為多個(gè)組(不一定要在文件系統(tǒng)上新建目錄),然后分而治之,這種情況不需要用鎖.
鎖不是用于這種場(chǎng)景的,鎖用于下面這種場(chǎng)景:
1. 文件file.txt里面記錄了user1的銷售額和user2的銷售額,user1+user2的銷售總額
2. 進(jìn)程php1負(fù)責(zé)寫入user1的數(shù)據(jù),進(jìn)程php2負(fù)責(zé)寫入user2的數(shù)據(jù),兩個(gè)進(jìn)程各讀出銷售總額顯示給user1,user2
3. user1和user2同時(shí)要求寫入,真的是同時(shí),不是前后差個(gè)幾秒什么的
建議你這樣解決:
1. 啟動(dòng)多個(gè)PHP進(jìn)程(nohup php your_script.php your_dir &)
2. 每個(gè)PHP進(jìn)程賦予一個(gè)序號(hào)(假設(shè)4個(gè)進(jìn)程,那就0,1,2,3),可以通過對(duì)進(jìn)程自身的pid模運(yùn)算取余數(shù)得到,也可以在啟動(dòng)進(jìn)程的時(shí)候通過命令行傳入,隨你了
3. 每個(gè)進(jìn)程在處理文件前先對(duì)文件名做crc32()運(yùn)算,模一下進(jìn)程總數(shù): crc32(file_name) % 4, 取模結(jié)果與此進(jìn)程的序號(hào)相等就讀取內(nèi)容并處理,不相等就跳過

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超3個(gè)贊
用memcached實(shí)現(xiàn)吧。
比如讀取文件 $filename = "t.txt";
if(!$memcached->get($filename)){ //文件鎖不存在,那么執(zhí)行文件讀取功能 //首先再將文件鎖住, $memcaced->save($filename,'1'); $fs = fopen($filename,'r+'); fclose($fs); //讀取完畢釋放文件鎖 $memcaced->delete($filename); }else{ // 文件鎖已經(jīng)存在,跳過 }
以上是 memcaced 純內(nèi)存操作,速度會(huì)很快,根本不要考慮到性能的問題,當(dāng)然還有一種方法,采用真正的文件鎖,即添加一個(gè)新文件的方法控制,文件爭(zhēng)用,但是此方法將加大IO的開銷。
- 2 回答
- 0 關(guān)注
- 132 瀏覽
添加回答
舉報(bào)