您好,登錄后才能下訂單哦!
這篇文章主要介紹了PHP怎么使用文件鎖解決高并發(fā)問題,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
新建一個.txt文件,文件中什么都不用寫。
【一】.阻塞(等待)模式:(只要有其他進(jìn)程已經(jīng)加鎖文件,當(dāng)前進(jìn)程會一直等其他進(jìn)程解鎖文件)
<?php //連接數(shù)據(jù)庫 $con=mysqli_connect("192.168.2.186","root","root","test"); //查詢商品數(shù)量是否大于0,大于0才能下單,并減少庫存 $fp = fopen("lock.txt", "r"); //加鎖 if(flock($fp,LOCK_EX)) { $res=mysqli_fetch_assoc(mysqli_query($con,'SELECT total FROM shop WHERE id=1 LIMIT 1')); if($res['total']>0){mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1');} //執(zhí)行完成解鎖 flock($fp,LOCK_UN); } //關(guān)閉文件 fclose($fp); unset($res); mysqli_close($con); ?>
【二】.非阻塞(等待)模式:(只要有其他進(jìn)程已經(jīng)加鎖文件,當(dāng)前進(jìn)程不會等其他進(jìn)程解鎖文件直接返回)
<?php //連接數(shù)據(jù)庫 $con=mysqli_connect("192.168.2.186","root","root","test"); //查詢商品數(shù)量是否大于0,大于0才能下單,并減少庫存 $fp = fopen("lock.txt", "r"); //加鎖 if(flock($fp,LOCK_EX | LOCK_NB)) { $res=mysqli_fetch_assoc(mysqli_query($con,'SELECT total FROM shop WHERE id=1 LIMIT 1')); if($res['total']>0){mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1');} //執(zhí)行完成解鎖 flock($fp,LOCK_UN); } //關(guān)閉文件 fclose($fp); unset($res); mysqli_close($con); ?>
如果連接數(shù)據(jù)庫費(fèi)時間的話,下面有個簡單的小demo,可以更直觀的理解下。
demo.php
<?php $fp = fopen("file_lock.txt", "r"); // 加鎖 if(flock($fp, LOCK_EX)) { sleep(10); echo 1; //執(zhí)行完成解鎖 flock($fp,LOCK_UN); } else { echo 2; } //關(guān)閉文件 fclose($fp);
demo2.php
<?php $fp = fopen("file_lock.txt", "r"); // 加鎖(如果改成flock($fp, LOCK_EX | LOCK_NB),demo2.php會直接返回2,否則會等待demo.php執(zhí)行完返回1) if(flock($fp, LOCK_EX)) { echo 1; } else { echo 2; } //關(guān)閉文件 fclose($fp);
同時運(yùn)行兩個文件,然后修改demo2中加鎖機(jī)制,就可以看出來阻塞(等待)模式和非阻塞(等待)模式的區(qū)別了。
但是這樣會導(dǎo)致隊列堵塞,假如10個人同一秒寫入數(shù)據(jù)庫,那就堵塞了,第10個人會等待前9個都執(zhí)行完才會執(zhí)行!
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享PHP怎么使用文件鎖解決高并發(fā)問題內(nèi)容對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問題就找億速云,詳細(xì)的解決方法等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。