PHP 파일 잠금으로 높은 동시성을 해결합니다.

不言
풀어 주다: 2023-03-22 22:44:01
원래의
3683명이 탐색했습니다.

이 기사에서는 높은 동시성을 해결하기 위한 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,&#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 파일 잠금으로 높은 동시성을 해결합니다

파일에 아무것도 쓰지 않고 새 .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.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿