PHP 鎖機制

子曰發表於2019-02-16

應用環境

解決高併發,庫存為負數的情況

阻塞模式

如果其他程式已經加鎖檔案,當前程式會一直等其他程式解鎖檔案後繼續執行

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更通用

相關文章