最新php 文件鎖大全

網(wǎng)絡(luò)整理 分享 時(shí)間: 收藏本文

最新php 文件鎖大全

在日常的學(xué)習(xí)、工作、生活中,肯定對(duì)各類范文都很熟悉吧。寫范文的時(shí)候需要注意什么呢?有哪些格式需要注意呢?這里我整理了一些優(yōu)秀的范文,希望對(duì)大家有所幫助,下面我們就來了解一下吧。

php 文件鎖篇一

下面是由百分網(wǎng)小編為大家整理的php文件鎖與進(jìn)程鎖的實(shí)現(xiàn),喜歡的可以收藏一下!了解更多詳情資訊,請(qǐng)關(guān)注應(yīng)屆畢業(yè)生考試網(wǎng)!

借用swoole的服務(wù)器/客戶端與多進(jìn)程機(jī)制對(duì)鎖進(jìn)行說明.

這里只針對(duì)php的鎖機(jī)制進(jìn)行說明,由于sql的鎖與其作用方式和應(yīng)用場(chǎng)景不同,將作另行說明.

1.文件鎖

flock()

fclose()

swoole_lock()

文件鎖的可能應(yīng)用場(chǎng)景為:

1.限制并發(fā)多進(jìn)程或多臺(tái)服務(wù)器需要對(duì)同一文件進(jìn)行訪問和修改;

2.對(duì)參與文件i/o的進(jìn)程隊(duì)列化和人為阻塞;

3.在業(yè)務(wù)邏輯中對(duì)文件內(nèi)容進(jìn)行守護(hù);

下面是文件鎖c/s通訊機(jī)制下的使用,已經(jīng)省略了具體的通訊過程,如有需要請(qǐng)移步swoole異步任務(wù)隊(duì)列

server(服務(wù)器通訊過程已略):

//監(jiān)聽數(shù)據(jù)發(fā)送事件

$serv->on('receive', function ($serv, $fd, $from_id, $data) {

$serv->send($fd, "serverend");

$p_file = "";

var_dump(file_get_contents($p_file));

});

client1(服務(wù)器通訊過程已略):

$s_recv = "ww";

$p_file = "";

$o_file = fopen($p_file,'w+');// flock()加鎖方式:

flock($o_file,lock_ex);// // swoole加鎖方式:

// $lock = new swoole_lock(swoole_filelock, $p_file);

// $lock->lock();

fwrite($o_file, 'ss' . $s_recv);

sleep(30);// 兩種解鎖方式

// flock($o_file, lock_un);

// $lock->unlock();

client2(服務(wù)器通訊過程已略):

$s_recv = "xx";

$p_file = "";

$o_file = fopen($p_file,'w+');// flock()加鎖方式:

flock($o_file,lock_ex);//

// swoole加鎖方式:

// $lock = new swoole_lock(swoole_filelock, $p_file);

// $lock->lock();

fwrite($o_file, 'ss' . $s_recv);// 兩種解鎖方式

// flock($o_file, lock_un);

// $lock->unlock();

結(jié)果:

client2被阻塞了30s,直到client1執(zhí)行結(jié)束才對(duì)文件進(jìn)行了一次寫入;

[l0.16@4 m29.5% c30s04] $ php

需要注意的是:

1.無論是flock()還是swoole提供的swoole_lock(),都有在進(jìn)程結(jié)束時(shí)自動(dòng)解鎖的機(jī)制,所以在demo中即使不進(jìn)行手動(dòng)解鎖也能正常運(yùn)行,因此這里在第一個(gè)client中執(zhí)行了sleep()暫停函數(shù)來觀察文件鎖的效果;

()的標(biāo)準(zhǔn)釋放方式為flock($file,lock_un);, 但是個(gè)人喜歡fclose(),永絕后患;

2.進(jìn)程鎖

與文件鎖不同的是,進(jìn)程鎖并不用于阻止對(duì)文件的i/o,而是用于防止多進(jìn)程并發(fā)造成的預(yù)期之外的后果.所以需要在多進(jìn)程并發(fā)時(shí)將其隊(duì)列化,即在某進(jìn)程的關(guān)鍵邏輯執(zhí)行結(jié)束前阻塞其他并發(fā)進(jìn)程的邏輯執(zhí)行.

實(shí)現(xiàn)思路有幾種:

1.利用flock()文件鎖,創(chuàng)建一個(gè)臨時(shí)lock文件,使用lock_nb模擬阻塞或非阻塞流,再在進(jìn)程內(nèi)部使用判定條件控制邏輯執(zhí)行;

非阻塞模型demo:

$p_file = "";

$o_file = fopen($p_file, 'w+');// 如果臨時(shí)文件被鎖定,這里的flock()將返回false

if (!flock($o_file, lock_ex + lock_nb)) {

var_dump('process locked');

}else { ? ?// 非阻塞模型必須在flock()中增加lock_nb參數(shù)

// 當(dāng)然,這里取消lock_nb參數(shù)就是阻塞模型了

flock($o_file, lock_ex + lock_nb);

var_dump('process locking'); ? ?// 模擬長(zhǎng)時(shí)間的執(zhí)行操作

sleep(10);

}

2.利用swoole提供的共享內(nèi)存,緩存方法或通信方法在不同的.進(jìn)程中傳遞一個(gè)全局變量,進(jìn)程獲取該變量的狀態(tài)后使用判定條件控制邏輯執(zhí)行;

傳遞變量的方法很多,這里只提供一個(gè)思路,就以memcached為例;

阻塞模型demo:

// 初始化memcached$memcached = new memcache;

$memcached->connect("localhost", 11211);// 獲取用來做狀態(tài)判定的全局變量

$s_flag = $memcached->get("flag");

if (!$s_flag) {

// 這里利用了memcached的過期時(shí)間作為演示,實(shí)際上業(yè)務(wù)處理完成后銷毀該變量即可

$memcached->set("flag", "locked", 0, 10);

main();

}else {

// 阻塞模型

while ($s_flag == 'locked') {

var_dump('process locked, retrying...');

// 設(shè)置重試時(shí)間, 避免過于頻繁的操作嘗試

sleep(1); ? ? ? ?// 更新狀態(tài)變量

$s_flag = $memcached->get("flag");

}

// // 非阻塞模型

// if ($s_flag == 'locked') {

// ? ? var_dump('process locked, suspended');

// ? ? die();

// }

main();

}// 模擬業(yè)務(wù)主函數(shù)function main() {

var_dump('process running'); ?// 業(yè)務(wù)執(zhí)行結(jié)束后回收memcached

// $memcached->delete("flag");

}

這里需要注意的是:

hed的過期時(shí)間不可少于程序運(yùn)行的實(shí)際時(shí)間,因此建議稍微長(zhǎng)一點(diǎn),邏輯執(zhí)行結(jié)束后進(jìn)行回收;

2.在非阻塞模型中,若狀態(tài)被判定為false,應(yīng)該將進(jìn)程中止或block,避免業(yè)務(wù)邏輯的繼續(xù)執(zhí)行;

3.在實(shí)際應(yīng)用中,設(shè)置一個(gè)重試時(shí)間很有必要,這樣可以很大程度上減少針對(duì)memcached的大量i/o并發(fā),減輕服務(wù)器壓力;

s("content_relate");

【php文件鎖與進(jìn)程鎖的實(shí)現(xiàn)】相關(guān)文章:

php文件鎖與進(jìn)程鎖

09-06

linux新手教程之創(chuàng)建鎖文件的方法

08-21

php中讀取大文件實(shí)現(xiàn)方法

09-05

php實(shí)現(xiàn)大文件上傳源代碼

08-29

php中讀取大文件實(shí)現(xiàn)方法詳解

09-23

php文件是什么 如何打開php文件

08-27

鑰匙鎖車內(nèi)怎么辦

11-11

php文件怎么操作

09-07

php文件緩存的性能測(cè)試

09-10

信息流廣告 競(jìng)價(jià)托管 招生通 周易 易經(jīng) 代理招生 二手車 網(wǎng)絡(luò)推廣 自學(xué)教程 招生代理 旅游攻略 非物質(zhì)文化遺產(chǎn) 河北信息網(wǎng) 石家莊人才網(wǎng) 買車咨詢 河北人才網(wǎng) 精雕圖 戲曲下載 河北生活網(wǎng) 好書推薦 工作計(jì)劃 游戲攻略 心理測(cè)試 石家莊網(wǎng)絡(luò)推廣 石家莊招聘 石家莊網(wǎng)絡(luò)營(yíng)銷 培訓(xùn)網(wǎng) 好做題 游戲攻略 考研真題 代理招生 心理咨詢 游戲攻略 興趣愛好 網(wǎng)絡(luò)知識(shí) 品牌營(yíng)銷 商標(biāo)交易 游戲攻略 短視頻代運(yùn)營(yíng) 秦皇島人才網(wǎng) PS修圖 寶寶起名 零基礎(chǔ)學(xué)習(xí)電腦 電商設(shè)計(jì) 職業(yè)培訓(xùn) 免費(fèi)發(fā)布信息 服裝服飾 律師咨詢 搜救犬 Chat GPT中文版 語料庫(kù) 范文網(wǎng) 工作總結(jié) 二手車估價(jià) 情侶網(wǎng)名 愛采購(gòu)代運(yùn)營(yíng) 情感文案 古詩(shī)詞 邯鄲人才網(wǎng) 鐵皮房 衡水人才網(wǎng) 石家莊點(diǎn)痣 微信運(yùn)營(yíng) 養(yǎng)花 名酒回收 石家莊代理記賬 女士發(fā)型 搜搜作文 石家莊人才網(wǎng) 銅雕 關(guān)鍵詞優(yōu)化 圍棋 chatGPT 讀后感 玄機(jī)派 企業(yè)服務(wù) 法律咨詢 chatGPT國(guó)內(nèi)版 chatGPT官網(wǎng) 勵(lì)志名言 兒童文學(xué) 河北代理記賬公司 教育培訓(xùn) 游戲推薦 抖音代運(yùn)營(yíng) 朋友圈文案 男士發(fā)型 培訓(xùn)招生 文玩 大可如意 保定人才網(wǎng) 黃金回收 承德人才網(wǎng) 石家莊人才網(wǎng) 模型機(jī) 高度酒 沐盛有禮 公司注冊(cè) 造紙術(shù) 唐山人才網(wǎng) 沐盛傳媒