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 가 자 물 쇠 를 추가 하여 동시 다발 상황 에서 코드 를 빼 앗 는 기능 을 실현 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.