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