国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP使用文件鎖解決高并發問題示例

2024-05-05 00:02:57
字體:
來源:轉載
供稿:網友

本文實例講述了PHP使用文件鎖解決高并發問題。分享給大家供大家參考,具體如下:

新建一個.txt文件,文件中什么都不用寫。

【一】.阻塞(等待)模式:(只要有其他進程已經加鎖文件,當前進程會一直等其他進程解鎖文件)

<?php//連接數據庫$con=mysqli_connect("192.168.2.186","root","root","test");//查詢商品數量是否大于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');}  //執行完成解鎖  flock($fp,LOCK_UN);}//關閉文件fclose($fp);unset($res);mysqli_close($con);?>

【二】.非阻塞(等待)模式:(只要有其他進程已經加鎖文件,當前進程不會等其他進程解鎖文件直接返回)

<?php//連接數據庫$con=mysqli_connect("192.168.2.186","root","root","test");//查詢商品數量是否大于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');}  //執行完成解鎖  flock($fp,LOCK_UN);}//關閉文件fclose($fp);unset($res);mysqli_close($con);?>

如果連接數據庫費時間的話,下面有個簡單的小demo,可以更直觀的理解下。

demo.php

<?php$fp = fopen("file_lock.txt", "r");// 加鎖if(flock($fp, LOCK_EX)){  sleep(10);  echo 1;  //執行完成解鎖  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執行完返回1)if(flock($fp, LOCK_EX)){  echo 1;} else {  echo 2;}//關閉文件fclose($fp);

同時運行兩個文件,然后修改demo2中加鎖機制,就可以看出來阻塞(等待)模式和非阻塞(等待)模式的區別了。

但是這樣會導致隊列堵塞,假如10個人同一秒寫入數據庫,那就堵塞了,第10個人會等待前9個都執行完才會執行!

希望本文所述對大家PHP程序設計有所幫助。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 德阳市| 额尔古纳市| 任丘市| 海兴县| 临西县| 康乐县| 海南省| 宾阳县| 民乐县| 高唐县| 新郑市| 周宁县| 平遥县| 雷州市| 龙岩市| 贡山| 双峰县| 克拉玛依市| 尉氏县| 涞水县| 色达县| 卢氏县| 平南县| 晋宁县| 安仁县| 临沧市| 新郑市| 舟曲县| 新昌县| 阿拉尔市| 隆子县| 五莲县| 光山县| 延长县| 玛纳斯县| 关岭| 浮山县| 连南| 东平县| 龙江县| 宜州市|