PHP 鎖機制

應用環境

解決高併發,庫存爲負數的狀況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.phpcode

參考文檔

https://www.gaojiufeng.cn/?id=97
https://www.jb51.net/article/...
http://www.cnblogs.com/scotom...htm

備註

網上還有eaccelerator方式使用,仍是file更通用blog

相關文章
相關標籤/搜索