이 기사에서는 높은 동시성을 해결하기 위한 PHP 파일 잠금 방법에 대해 공유합니다. 필요한 친구는 이 기사의 내용을 참조할 수 있습니다.
높은 동시성을 해결하기 위한 PHP 파일 잠금
새 .txt 파일 만들기, file 에는 아무 것도 쓸 필요가 없습니다.
[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 파일 잠금으로 높은 동시성을 해결합니다
파일에 아무것도 쓰지 않고 새 .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 중국어 웹사이트의 기타 관련 기사를 참조하세요!