>  기사  >  백엔드 개발  >  PHP에서 잠금 메커니즘 적용

PHP에서 잠금 메커니즘 적용

不言
不言원래의
2018-07-28 10:05:582425검색

이 글은 PHP에서 잠금 메커니즘을 적용하는 방법을 소개합니다. 도움이 필요한 친구들에게 도움이 되기를 바랍니다.

애플리케이션 환경

높은 동시성 및 부정적인 인벤토리 상황 해결

차단 모드

다른 프로세스가 파일을 잠근 경우 현재 프로세스는 다른 프로세스가 파일을 잠금 해제하고 계속 실행하기를 기다립니다

flock ($fp , LOCK_EX) // 파일 잠금flock($fp, LOCK_EX)     // 文件锁

非阻塞模式

如果其他进程已经加锁文件,当前进程不会等其他进程解锁文件,直接返> 回,也就是直接忽略加锁的代码到关闭文件那块

flock($fp,LOCK_EX | LOCK_NB)        // 文件锁

代码

flock($fp, LOCK_EX)flock($fp,LOCK_EX | LOCK_NB) 换一下就行,其他都一样

<?php
$fp = fopen(&#39;lock.txt&#39;, &#39;r&#39;);
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

Non-blocking mode

다른 프로세스가 파일을 잠근 경우 현재 프로세스는 다른 프로세스가 파일을 잠금 해제할 때까지 기다리지 않고 직접 반환합니다. 즉, 잠금코드를 직접 무시하고 파일을 닫는 부분으로 이동

flock($fp, LOCK_EX | LOCK_NB) //파일 잠금

code

flock($fp, LOCK_EX) Flock($fp,LOCK_EX | LOCK_NB) 변경하기만 하면 다른 모든 것은 동일합니다rrreee

동시성 테스트🎜🎜데이터베이스 인벤토리가 일관되고 ab 매개변수가 0으로 유지되는지 확인하세요. -c: 동시 횟수, -n: 총 요청 수🎜🎜ab -c 20 -n 1000 http://www.test.com/test.php🎜🎜관련 권장 사항: 🎜🎜🎜 이미지를 동일한 비율로 압축하는 방법에 대한 PHP 코드🎜🎜🎜 🎜PHP 명령줄에 쉘 명령을 작성하는 예🎜🎜

위 내용은 PHP에서 잠금 메커니즘 적용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.