>백엔드 개발 >PHP 튜토리얼 >PHP 파일 잠금을 사용하여 높은 동시성 문제를 해결하는 단계에 대한 자세한 설명

PHP 파일 잠금을 사용하여 높은 동시성 문제를 해결하는 단계에 대한 자세한 설명

php中世界最好的语言
php中世界最好的语言원래의
2018-05-17 13:47:502072검색

이번에는 PHP에서 파일 잠금을 사용하여 높은 동시성을 해결하는 단계에 대해 자세히 설명하겠습니다. PHP에서 높은 동시성을 해결하기 위해 파일 잠금을 사용할 때의 주의 사항은 무엇입니까? .

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

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

<?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);
?>

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

<?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에서 함수 매개변수를 동적으로 가져오는 단계에 대한 자세한 설명

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

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