應用環境
解決高並發,庫存為負數的情況
阻塞模式
如果其他進程已經加鎖文件,當前進程會一直等其他進程解鎖文件后繼續執行
flock($fp, LOCK_EX) // 文件鎖
非阻塞模式
如果其他進程已經加鎖文件,當前進程不會等其他進程解鎖文件,直接返> 回,也就是直接忽略加鎖的代碼到關閉文件那塊
flock($fp,LOCK_EX | LOCK_NB) // 文件鎖
代碼
flock($fp, LOCK_EX)
和 flock($fp,LOCK_EX | LOCK_NB)
換一下就行,其他都一樣
<?php
$fp = fopen('lock.txt', 'r');
if( flock($fp, LOCK_EX) ){ // flock($fp,LOCK_EX | LOCK_NB)
$info = D()->query('SELECT surplus_total_num FROM tb_product WHERE id=1 LIMIT 1');
if( $info['surplus_total_num'] > 0 ){
D()->execute('UPDATE tb_product SET surplus_total_num = surplus_total_num - 1 WHERE id=1');
$isSurplusProduct = 1;
}else{
$isSurplusProduct = 0;
}
flock($fp, LOCK_UN);
}
fclose($fp);
if( !$isSurplusProduct ) exit('已經沒有產品了');
並發測試
查看數據庫的庫存是否一致保持為0 ab參數:-c:並發數;-n:總請求數
ab -c 20 -n 1000 http://www.test.com/test.php
參考文檔
https://www.gaojiufeng.cn/?id=97
https://www.jb51.net/article/...
http://www.cnblogs.com/scotom...
備注
網上還有eaccelerator方式使用,還是file更通用