PHP가 파일 잠금을 사용하여 높은 동시성 문제를 해결하는 방법

小云云
풀어 주다: 2018-03-30 10:16:01
원래의
2266명이 탐색했습니다.

이 글에서는 높은 동시성 문제를 해결하기 위해 PHP에서 파일 잠금을 사용하는 방법을 주로 소개합니다. PHP 차단 모드와 비차단 모드 파일 잠금의 관련 사용 기술을 분석하여 높은 동시성 문제를 해결하는 방법을 예제 형식으로 소개합니다. 참고하시면 도움이 되실 것 같아요.

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

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


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

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


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

데이터베이스에 연결하는 데 시간이 걸리는 경우 간단한 데모를 통해 보다 직관적으로 이해할 수 있습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!