/**********************************************
成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括榆林網(wǎng)站建設(shè)、榆林網(wǎng)站制作、榆林網(wǎng)頁制作以及榆林網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,榆林網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到榆林省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
*file?lock
*@author?Zeal?
Li
*
***********************************************/
/*
*lock_thisfile:獲得獨(dú)享鎖
*@param?$tmpFileStr?用來作為共享鎖文件的文件名(可以隨便起一個(gè)名字)
*@param?$locktype?鎖類型,缺省為false(非阻塞型,也就是一旦加鎖失敗則直接返回false),設(shè)置為true則會(huì)一直等待加鎖成功才返回
*@return?如果加鎖成功,則返回鎖實(shí)例(當(dāng)使用unlock_thisfile方法的時(shí)候需要這個(gè)參數(shù)),加鎖失敗則返回false.
*/
function?
lock_thisfile($tmpFileStr,$locktype=false){
if($locktype?==?
false)
$locktype?=?LOCK_EX|LOCK_NB;
$can_write?=?0;
$lockfp?=?@fopen($tmpFileStr.".lock","w");
if($lockfp){
$can_write?=?@flock($lockfp,$locktype);
}
if($can_write){
return?$lockfp;
}
else{
if($lockfp){
@fclose($lockfp);
@unlink($tmpFileStr.".lock");
}
return?false;
}
}
/**?
*unlock_thisfile:對(duì)先前取得的鎖實(shí)例進(jìn)行解鎖
*@param?$fp?lock_thisfile方法的返回值
*@param?$tmpFileStr?
用來作為共享鎖文件的文件名(可以隨便起一個(gè)名字)
*/
function?
unlock_thisfile($fp,$tmpFileStr){
@flock($fp,LOCK_UN);
@fclose($fp);
@fclose($fp);
@unlink($tmpFileStr.".lock");
}
?
?php
//?使用舉例
$tmpFileStr?=?"/tmp/mylock.loc";
//?等待取得操作權(quán)限,如果要立即返回則把第二個(gè)參數(shù)設(shè)為false.
$lockhandle?=?
lock_thisfile($tmpFileStr,true);
if($lockhandle){
//?
在這里進(jìn)行所有需要獨(dú)占的事務(wù)處理。
//?...?...
//?事務(wù)處理完畢。
unlock_thisfile($lockhandle,$tmpFileStr);
}
?
如果要一次性做很多次插入,最好在每個(gè)循環(huán)的前后加上LOCK TABLES和UNLOCK TABLES,從而讓其他進(jìn)程也能訪問數(shù)據(jù)表;這么做性能依然不錯(cuò)。
不然的話,會(huì)導(dǎo)致數(shù)據(jù)莫明其妙的插入不完整,或者沒插進(jìn)去的情況。
一般情況下,MYSQL在更新操作會(huì)自動(dòng)加表鎖。不需要顯式加鎖。除非是數(shù)據(jù)要求嚴(yán)格的邏輯寫順序。
執(zhí)行查詢語句(SELECT)前,會(huì)自動(dòng)給涉及的所有表加讀鎖,在執(zhí)行更新操作 (UPDATE、DELETE、INSERT等)前,會(huì)自動(dòng)給涉及的表加寫鎖,這個(gè)過程并不需要用戶干預(yù),因此,用戶一般不需要直接用LOCK TABLE命令給MyISAM表顯式加鎖。
1、數(shù)據(jù)庫里有個(gè)東西叫鎖
2、在每個(gè)人操作表的時(shí)候,對(duì)表加鎖,這樣防止別人對(duì)表數(shù)據(jù)臟讀、臟寫
3、操作完成后,釋放鎖
4、小心,加鎖后可能會(huì)造成死鎖,特別是鎖過多的時(shí)候。
用鎖需謹(jǐn)慎,有風(fēng)險(xiǎn),但對(duì)數(shù)據(jù)來說是安全的
你的問題是:
1. 很多文件,想多進(jìn)程處理,以提高效率,縮短總處理時(shí)間
2. 這些進(jìn)程只需要讀文件,不需要寫
3. 對(duì)每個(gè)文件,只要有一個(gè)進(jìn)程處理過它就可以了,沒有多個(gè)進(jìn)程都必須處理它的需求
你的需求其實(shí)是分治,將文件分為多個(gè)組(不一定要在文件系統(tǒ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
建議你這樣解決:
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)容并處理,不相等就跳過
文章標(biāo)題:php數(shù)據(jù)庫加鎖 mysql數(shù)據(jù)庫加鎖
文章起源:http://m.rwnh.cn/article20/doopojo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、面包屑導(dǎo)航、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站制作、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)