PHP 鎖機制
阿新 • • 發佈:2018-11-19
應用環境
解決高併發,庫存為負數的情況
阻塞模式
如果其他程序已經加鎖檔案,當前程序會一直等其他程序解鎖檔案後繼續執行
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更通用