>  기사  >  백엔드 개발  >  PHP mysql 대규모 사용자 로그인 솔루션 분석_php 기술

PHP mysql 대규모 사용자 로그인 솔루션 분석_php 기술

WBOY
WBOY원래의
2016-05-16 20:26:50911검색

이 글은 php mysql 대량 사용자 로그인 솔루션을 예시를 통해 분석한 것입니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.

바이두, QQ, 360 등 대기업은 모두 수억 명의 사용자를 보유하고 있으며 모든 하위 웹사이트가 하나의 계정으로 로그인할 뿐만 아니라 다른 웹사이트에서도 사용할 수 있도록 사용자 플랫폼을 공개합니다. 데이터 양과 방문수 측면에서 최적화가 이루어지지 않으면 아마도 곧 다운될 것입니다. 이들 회사는 등록 및 로그인을 유지하는 전담 팀을 보유하고 있으며 세부적인 디자인이 매우 우수합니다. 이제 그들의 디자인 계획에 대해 간략하게 설명하겠습니다. 🎜>

빅 데이터의 경우 PHP에 대한 부담이 없지만 주로 MySQL에 있습니다. PHP는 로드 밸런싱을 수행할 수 있습니다. 10대의 시스템이 이를 처리할 수 없으면 20대 또는 100대를 사용하면 됩니다. 이는 병목 현상이 아닙니다.

하지만 MySQL은 슬레이브를 아무리 많이 만들어도 쿼리가 최적화되어 있기 때문에 단순히 머신을 추가하는 것만으로는 문제를 해결할 수 없습니다. 게다가 쿼리도 Memcache 캐싱을 통해 줄일 수 있습니다. 라이브러리의 경우 일반적으로 마스터 1개와 슬레이브 4개이면 충분합니다.

다음은 데이터베이스 솔루션을 주로 소개합니다.

사용자가 "로그인 이름", "이메일" 또는 "휴대폰번호"를 통해 로그인할 수 있다고 가정합니다.

테이블 구조는 다음과 같습니다.

login_hash에 따라 100개의 테이블로 구분된 로그인 이름과 ID 테이블


코드 복사 코드는 다음과 같습니다.
CREATE TABLE user_login(
login_name VARCHAR() 사용자 로그인 이름("로그인 이름", "이메일" 또는 "휴대폰 번호" 가능) 로그인
login_hash 사용자 로그인 이름의 BIGINT HASH 코드
user_id BIGINT 사용자 ID
);
CREATE TABLE user_login0 LIKE user_login
CREATE TABLE user_login1 LIKE user_login
… …
CREATE TABLE user_login100 LIKE user_login
user_id에 따라 100개의 테이블로 구분된 ID 및 사용자 정보 테이블
CREATE TABLE user_info(

user_id BIGINT 사용자 ID
login_pwd CHAR() 사용자 로그인 비밀번호
… …기타정보, 집주소, 휴대폰번호, 성별 등
);

user_info0 LIKE 테이블 생성
user_info1 LIKE 테이블 생성
… …
CREATE TABLE user_info2 LIKE user_info;


비즈니스 구현 논리: 서버에 따라 다릅니다. 자체 증가 ID 서비스(Oracle 시퀀스와 동일)를 구현하거나 직접 구현할 수 있습니다(PHP MySQL 또는 C 사용). 목적은 이 서비스에서 ID를 가져오는 것입니다. 매번 가져오는 ID 수는 마지막 시간을 기준으로 1입니다. 이는 테이블 내에서 증가할 수 없다는 점을 제외하면 MySQL의 자동 증가와 매우 유사합니다.

등록 절차:

1) 사용자 이름, 이메일, 휴대폰 번호, 비밀번호 및 기타 형식을 확인합니다. 생략…

2) 115라고 가정하고 서비스에서 ID를 가져옵니다.

3) 사용자의 로그인 유형이 이메일(예: $loginName='songhuan@zixue.it')인 경우 로그인 이름 앞에 로그인 이름 결과 접두어를 추가합니다(예: $loginName='mail_songhuan@zixue.it') )

4) 로그인 이름의 HASH 값 찾기: $loginHash=md5($loginName); md5 값의 해시의 경우 asc 코드를 찾거나 자체 알고리즘을 사용하여 최종적으로 $loginHash=를 얻을 수 있습니다. 16비트 또는 32비트 정수

5) $tableName = 'user_login' .($loginHash 0), user_login 테이블 이름을 얻은 경우 결과는 user_login88입니다.

$tableName = 'user_info' (115 0), user_info 테이블 이름을 얻은 경우.

6) SQL 실행:


코드 복사 코드는 다음과 같습니다.
INSERT INTO user_login88(login_name, login_hash, user_id) VALUES('songhuan@ zixue.it', 183239324323, 1); user_info15(user_id, login_pwd) VALUES(115, 'afiefliefladifadfadfe')에 삽입;

로그인 과정:
1) 사용자의 로그인 유형이 이메일(예: $loginName='songhuan@zixue.it')인 경우 로그인 이름 앞에 로그인 이름 결과 접두어를 추가합니다(예: $loginName='mail_songhuan@zixue. )

2)

코드 복사 코드는 다음과 같습니다.$loginHash=ord(md5($loginName) );
3)

코드 복사 코드는 다음과 같습니다.$tableName = 'user_login' ($loginHash. 0) ;
결과가 user_login88인 경우
4) SQL 실행:

코드 복사 코드는 다음과 같습니다. SELECT id FROM user_login88 WHERE login_hash = $loginHash

데이터를 조회할 수 없는 경우 로그인 이름이 존재하지 않는 것입니다

5) id=115 를 얻을 수 있으면

코드 복사 코드는 다음과 같습니다.
$ tableName = 'user_info'.(115 0);

id, pwd … FROM user_info15 WHERE id = 115;

6) 비밀번호를 일치시키고, 비밀번호가 같지 않으면 false를 반환합니다.

7) 비밀번호가 동일할 경우 사용자 ID를 암호화하여 COOKIE에 넣은 후, 사용자 정보를 Memcache에 저장합니다.

이 기사가 모든 사람의 PHP 프로그래밍 설계에 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.