이번에는 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,'SELECT total FROM shop WHERE id=1 LIMIT 1')); if($res['total']>0){mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1');} //执行完成解锁 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,'SELECT total FROM shop WHERE id=1 LIMIT 1')); if($res['total']>0){mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1');} //执行完成解锁 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!