PHP를 기반으로 동시성으로 코드 캡쳐 기능을 구현하기 위해 잠금을 사용하는 방법

墨辰丷
풀어 주다: 2023-03-29 09:02:02
원래의
1323명이 탐색했습니다.

이 글은 PHP 언어를 기반으로 하며 동시 조건에서 코드 잡기 기능을 구현하기 위해 잠금을 사용합니다. 코드 잡기는 특정 기간 동안 열려 있으며 공개된 코드가 반복되는 것을 매우 허용하지 않습니다. 세부사항 필요하신 분들은 참고하세요

요구 사항: 코드 잡기 기능

1. 코드 잡기는 특정 기간에만 가능합니다.

2.

3. 각 코드는 반복될 수 없습니다.

구현:

1. 동시성을 고려하지 않은 구현:

function get_code($len){
$CHAR_ARR = array('1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','X','Y','Z','W','S','R','T');
$CHAR_ARR_LEN = count($CHAR_ARR) - 1;
$code = '';
while(--$len > 0){ $code .= $CHAR_ARR[rand(0,$CHAR_ARR_LEN)]; }
return $code;
}
$pdo = new PDO('mysql:host=localhost;dbname=ci_test','root','root');
//查询当前时间已发放验证码数量
$code_num_rs = $pdo->query("SELECT COUNT(*) as sum FROM code_test");
$code_num_arr = $code_num_rs->fetch(PDO::FETCH_ASSOC);
$code_num = $code_num_arr['sum'];
if($code_num < 1){<br>   sleep(2); //暂停2秒
$code = get_code(6);
var_dump( $pdo->query("INSERT INTO code_test (code,create_time) VALUES (&#39;$code&#39;,".time().")") );
}
로그인 후 복사

위 코드는 기본적으로 현재 열기 시간을 만족하며, 코드는 반복되지 않습니다. 동시성을 고려하지 않은 처리:

1) 현재 데이터베이스에서 발급된 인증번호 개수를 조회하려면 선택 ;

 2) 아직 장소가 있는 경우 인증코드를 생성하여 데이터베이스에 삽입한 후 인증번호를 반환합니다.

 3) 공간이 가득 차면 장소가 없다는 메시지를 반환합니다.

2. 동시 조건에서 구현됨 :

  그런 다음 동시성의 경우 위 코드에서 얻은 결과를 살펴보세요.

  동시성을 테스트하려면 apache 벤치마크를 사용하여 테스트할 수 있습니다. apache 벤치마크는 ab -c 동시 번호와 같이 ab 명령을 통해 호출되는 cmd를 통해 apche의 bin 디렉터리에 입력합니다. -n 총 방문수 url

코드는 다음과 같습니다.

cb -c 100 -n 100 http://localhost/php_mulit.php

사용자는 100명입니다. 동료가 할당량을 잡으러 갑니다. 모든 사용자가 여전히 할당량이 있음을 알게 되면 인증 코드가 생성되어 데이터베이스에 삽입되고 인증 코드가 반환됩니다. 이로 인해 너무 많은 인증 코드가 발급됩니다. 실제로 이 명령을 실행한 후 데이터베이스에는 1개가 아닌 13개의 레코드가 더 포함됩니다.


이런 일이 발생하지 않도록 하려면 어떻게 해야 하나요?

  이 판단 과정에서 언제든지 하나의 프로세스만 실행되도록 전용 잠금을 추가하여 판단부터 삽입까지 프로세스를 잠글 수 있습니다. 구현은 다음과 같습니다:

//生成码
function get_code($len){
$CHAR_ARR = array(&#39;1&#39;,&#39;2&#39;,&#39;3&#39;,&#39;4&#39;,&#39;5&#39;,&#39;6&#39;,&#39;7&#39;,&#39;8&#39;,&#39;9&#39;,&#39;A&#39;,&#39;B&#39;,&#39;C&#39;,&#39;D&#39;,&#39;E&#39;,&#39;F&#39;,&#39;G&#39;,&#39;H&#39;,&#39;I&#39;,&#39;J&#39;,&#39;K&#39;,&#39;L&#39;,&#39;M&#39;,&#39;N&#39;,&#39;O&#39;,&#39;P&#39;,&#39;Q&#39;,&#39;X&#39;,&#39;Y&#39;,&#39;Z&#39;,&#39;W&#39;,&#39;S&#39;,&#39;R&#39;,&#39;T&#39;);
$CHAR_ARR_LEN = count($CHAR_ARR) - 1;
$code = &#39;&#39;;
while(--$len > 0){ $code .= $CHAR_ARR[rand(0,$CHAR_ARR_LEN)]; }
return $code;
}
$pdo = new PDO(&#39;mysql:host=localhost;dbname=ci_test&#39;,&#39;root&#39;,&#39;root&#39;);
$fp = fopen(&#39;lock.txt&#39;,&#39;r&#39;);
//通过排他锁 锁定该过程
if(flock($fp,LOCK_EX)){
//查询当前时间已发放验证码数量
$code_num_rs = $pdo->query("SELECT COUNT(*) as sum FROM code_test");
$code_num_arr = $code_num_rs->fetch(PDO::FETCH_ASSOC);
$code_num = $code_num_arr[&#39;sum&#39;];
if($code_num < 1){
sleep(2);
$code = get_code(6);
var_dump( $pdo->query("INSERT INTO code_test (code,create_time) VALUES (&#39;$code&#39;,".time().")") );
}
flock($fp,LOCK_UN);
fclose($fp);
}
로그인 후 복사

플록 기능을 통해 프로세스를 잠급니다.

더 많은 무리 정보는 PHP 매뉴얼을 참조하세요: http://php.net/manual/zh/function.flock.php

다시 실행

코드는 다음과 같습니다:

cb -c 100 -n 100 http:/ /localhost/php_mulit.php

단 하나의 레코드만 데이터베이스에 추가되어 동시 조건에서 데이터의 정확성을 보장합니다.


요약: 위 내용이 이 글의 전체 내용입니다. 모든 분들의 공부에 도움이 되었으면 좋겠습니다.

관련 권장 사항:

php

die()와exit()의 차이점에 대한 자세한 예

php

mailer 메일함 바인딩 구현 방법

php

이미지 처리 기능 사용 imagecopyresampled

위 내용은 PHP를 기반으로 동시성으로 코드 캡쳐 기능을 구현하기 위해 잠금을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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