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 ('$code',".time().")") );
} 
상기 코드 는 현재 개방 시간 을 기본적으로 만족 시 키 고 코드 와 중복 되 지 않 습 니 다. 
     병발 을 고려 하지 않 은 상태 에서 절차:
1)현재 데이터베이스 에서 발급 한 인증 코드 수량 을 선택 하여 조회 합 니 다.
2)정원 이 있 으 면 인증 코드 를 생 성하 여 데이터베이스 에 삽입 하고 인증 코드 를 클 라 이언 트 에 되 돌려 줍 니 다.
3)가득 차 면;힌트 를 되 돌려 줍 니 다.정원 이 없습니다.
2.동시 다발 상황 에서 실현:
그러면 위의 코드 가 동시 다발 상황 에서 얻 은 결 과 를 보 세 요.
테스트 병행,apache benchmark 를 사용 하여 테스트 할 수 있 습 니 다.apache benchmark 는 APACHE 산하 HTTP SERVER 의 성능 평가 도구 로 cmd 를 통 해 apche 의 bin 디 렉 터 리 에 들 어가 ab 명령 을 통 해 호출 됩 니 다.예 를 들 어 ab-c 병행 수량-n 총 방문 량 url

cb -c 100 -n 100 http://localhost/php_mulit.php
이렇게 하면 100 명의 사용자 동료 가 1 명의 정원 을 빼 앗 는 것 이다.조회 할 때 모든 사용자 가 한 명의 정원 을 조회 하면 인증 코드 를 생 성하 고 데이터 베 이 스 를 삽입 하여 인증 코드 를 되 돌려 준다.이렇게 해서 인증번호 가 많이 나 왔 습 니 다.사실 이 명령 을 실행 하고 나 면 데이터 베 이 스 는 하나 가 아 닌 13 개의 기록 이 더 많아 졌 다.
어떻게 이런 상황 이 발생 하 는 것 을 피 합 니까? 
     이 과정 을 삽입 할 때 까지 잠 금 을 통 해 판단 할 수 있 습 니 다.이 판단 절 차 는 임의의 시간 에 하나의 프로 세 스 만 실 행 될 수 있 도록 합 니 다.다음 과 같이 구현:

//   
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');
$fp = fopen('lock.txt','r');
//           
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['sum'];
if($code_num < 1){
sleep(2);
$code = get_code(6);
var_dump( $pdo->query("INSERT INTO code_test (code,create_time) VALUES ('$code',".time().")") );
}
flock($fp,LOCK_UN);
fclose($fp);
} 
flock 함 수 를 통 해 이 과정 을 잠 금 합 니 다.
더 많은 flock 정 보 는 php 매 뉴 얼 을 참고 할 수 있 습 니 다.http://php.net/manual/zh/function.flock.php
다시 실행

cb -c 100 -n 100 http://localhost/php_mulit.php
데이터 베 이 스 는 하나의 기록 만 추가 하여 병발 상황 에서 데이터 의 정확 함 을 보증 했다.
위 에서 말 한 것 은 편집장 이 여러분 에 게 소개 한 PHP 가 자 물 쇠 를 추가 하여 동시 다발 상황 에서 코드 를 빼 앗 는 기능 을 실현 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기