本文實例講述了PHP使用文件鎖解決高并發(fā)問題。分享給大家供大家參考,具體如下:
新建一個.txt文件,文件中什么都不用寫。
【一】.阻塞(等待)模式:(只要有其他進程已經(jīng)加鎖文件,當前進程會一直等其他進程解鎖文件)
?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);
}
//關閉文件
fclose($fp);
unset($res);
mysqli_close($con);
?>
【二】.非阻塞(等待)模式:(只要有其他進程已經(jīng)加鎖文件,當前進程不會等其他進程解鎖文件直接返回)
?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);
}
//關閉文件
fclose($fp);
unset($res);
mysqli_close($con);
?>
如果連接數(shù)據(jù)庫費時間的話,下面有個簡單的小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;
}
//關閉文件
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;
}
//關閉文件
fclose($fp);
同時運行兩個文件,然后修改demo2中加鎖機制,就可以看出來阻塞(等待)模式和非阻塞(等待)模式的區(qū)別了。
但是這樣會導致隊列堵塞,假如10個人同一秒寫入數(shù)據(jù)庫,那就堵塞了,第10個人會等待前9個都執(zhí)行完才會執(zhí)行!
更多關于PHP相關內容感興趣的讀者可查看本站專題:《php文件操作總結》、《PHP常用遍歷算法與技巧總結》、《PHP數(shù)據(jù)結構與算法教程》、《php程序設計算法總結》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設計有所幫助。
您可能感興趣的文章:- PHP讀寫文件高并發(fā)處理操作實例詳解
- php處理搶購類功能的高并發(fā)請求
- php結合redis實現(xiàn)高并發(fā)下的搶購、秒殺功能的實例
- php 根據(jù)url自動生成縮略圖并處理高并發(fā)問題
- PHP flock 文件鎖詳細介紹
- PHP程序中的文件鎖、互斥鎖、讀寫鎖使用技巧解析
- PHP文件鎖定寫入實例解析
- PHP文件鎖函數(shù)flock()詳細介紹
- PHP 文件鎖與進程鎖的使用示例
- PHP基于文件鎖解決多進程同時讀寫一個文件問題示例