>  기사  >  백엔드 개발  >  PHP는 높은 동시성 문제를 해결하기 위해 파일 잠금을 사용합니다.

PHP는 높은 동시성 문제를 해결하기 위해 파일 잠금을 사용합니다.

零到壹度
零到壹度원래의
2018-03-27 10:05:112338검색

이번에는 높은 동시성 문제를 해결하기 위해 Tphp의 파일 잠금을 사용하는 방법을 소개하겠습니다. PHP가 높은 동시성 문제를 해결하기 위해 파일 잠금을 사용할 때 주의 사항은 무엇입니까?

파일에 아무것도 쓰지 않고 새 .txt 파일을 만듭니다.

【One】.차단(대기) 모드: (다른 프로세스가 파일을 잠근 동안 현재 프로세스는 다른 프로세스가 파일을 잠금 해제할 때까지 기다립니다)

<span style="font-family: 微软雅黑, "Microsoft YaHei"; font-size: 14px;">     <?php<br/>     //连接数据库<br/>     $con=mysqli_connect("192.168.2.186","root","root","test");<br/>     //查询商品数量是否大于0,大于0才能下单,并减少库存<br/>     $fp = fopen("lock.txt", "r");<br/>     //加锁<br/>     if(flock($fp,LOCK_EX))<br/>{ <br/>   $res=mysqli_fetch_assoc(mysqli_query($con,&#39;SELECT total FROM shop WHERE id=1 LIMIT 1&#39;)); <br/>      if($res[&#39;total&#39;]>0){mysqli_query($con,&#39;UPDATE shop SET total=total-1  WHERE id=1&#39;);}    //执行完成解锁<br/>    flock($fp,LOCK_UN);<br/>}<br/>//关闭文件<br/>fclose($fp);<br/>unset($res);<br/>mysqli_close($con);<br/>?><br/></span>

【Two】. 비차단(대기) 모드: (다른 프로세스가 파일을 잠근 동안에는 현재 프로세스는 다른 프로세스가 파일을 잠금 해제하고 직접 반환할 때까지 기다리지 않습니다.)

<span style="font-family: 微软雅黑, "Microsoft YaHei"; font-size: 14px;">   <?php<br/>   //连接数据库<br/>   $con=mysqli_connect("192.168.2.186","root","root","test");<br/>   //查询商品数量是否大于0,大于0才能下单,并减少库存<br/>   $fp = fopen("lock.txt", "r");<br/>   //加锁if(flock($fp,LOCK_EX | LOCK_NB))<br/>{ <br/>   $res=mysqli_fetch_assoc(mysqli_query($con,&#39;SELECT total FROM shop WHERE id=1 LIMIT 1&#39;));   <br/>    if($res[&#39;total&#39;]>0){mysqli_query($con,&#39;UPDATE shop SET total=total-1  WHERE id=1&#39;);}   <br/>     //执行完成解锁<br/>    flock($fp,LOCK_UN);<br/>}//关闭文件<br/>fclose($fp);<br/>unset($res);<br/>mysqli_close($con);<br/>?></span>

데이터베이스에 연결하는 데 시간이 걸리는 경우 , 아래에 더 직관적인 간단한 데모가 있습니다.

   demo.php
   <?php$fp = fopen("file_lock.txt", "r");
   // 加锁
   if(flock($fp, LOCK_EX))
{
    sleep(10);
    echo 1;    
    //执行完成解锁
    flock($fp,LOCK_UN);
} else {  
  echo 2;
}
//关闭文件
fclose($fp);
demo2.php
<?php
$fp = fopen("file_lock.txt", "r");
// 加锁(如果改成flock($fp, LOCK_EX | LOCK_NB),demo2.php会直接返回2,否则会等待demo.php执行完返回1)
if(flock($fp, LOCK_EX))
{    echo 1;
} else {   
 echo 2;
}
//关闭文件
fclose($fp);

두 파일을 동시에 실행한 다음 데모2에서 잠금 메커니즘을 수정하면 차단(대기) 모드비차단(대기) 모드
의 차이점을 확인할 수 있습니다.

그러나 이로 인해 10명이 동시에 데이터베이스에 쓰면 10번째 사람은 실행하기 전에 처음 9개가 실행될 때까지 기다립니다.

위 내용은 PHP는 높은 동시성 문제를 해결하기 위해 파일 잠금을 사용합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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