解決高併發,庫存爲負數的狀況php
若是其餘進程已經加鎖文件,當前進程會一直等其餘進程解鎖文件後繼續執行html
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:總請求數.net
ab -c 20 -n 1000 http://www.test.com/test.php
code
https://www.gaojiufeng.cn/?id=97
https://www.jb51.net/article/...
http://www.cnblogs.com/scotom...htm
網上還有eaccelerator方式使用,仍是file更通用blog