国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

php+mysql大量用戶登錄解決方案分析

2024-05-04 23:29:35
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了php+mysql大量用戶登錄解決方案,較為詳細的分析了大量用戶登錄時負載過大的解決方案,具有一定的參考借鑒價值,需要的朋友可以參考下
 
 

本文實例分析了php+mysql大量用戶登錄解決方案。分享給大家供大家參考。具體分析如下:

百度、QQ、360等大公司都擁有上億的用戶量,不僅所有子網站都通過一個賬號登錄,而且還開放用戶平臺,提供給其他網站使用,這種級別的數據量和訪問量,如果不做優化,估計很快就會宕機,這些公司都是一個專門的團隊,維護一個注冊登錄,細節設計的非常優秀,現在粗略談下他們的設計方案.

大數據的時候,壓力不在PHP,主要在MySQL,PHP可以做負載均衡,10臺機器抗不住就用20臺或者100臺,這都不是瓶頸.

但是MySQL是單點的,無論做多少從庫,都是優化查詢,更新數據就無法只是簡單的通過加機器解決了,而且查詢也可以通過Memcache緩存減輕壓力,所以不必要做多少從庫的,一般1主4從就可以了.

下面主要介紹下數據庫的解決方案:

假設用戶可以通過“登錄名”、“郵箱”或“手機號”登錄.

表結構如下:

登錄名與ID表,根據login_hash分100張表

復制代碼代碼如下:
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; 
ID與用戶信息表,根據user_id分100張表

 

CREATE TABLE user_info( 
user_id BIGINT 用戶ID 
login_pwd CHAR() 用戶登錄密碼 
… … 其他信息,家庭住址、手機號、性別等等 
);
 
CREATE TABLE user_info0 LIKE user_info; 
CREATE TABLE user_info1 LIKE user_info; 
… … 
CREATE TABLE user_info2 LIKE user_info;


業務實現邏輯:

 

依賴服務器:實現一個自增ID的服務(相當于oracle的sequence),也可以自己實現(用PHP+MySQL或者用C實現都可以)。目的是可以 從這個服務中取ID,每次取的ID數都是在上次基礎上+1,和MySQL的autoincrement很像,只是不能在表內部自增。

注冊流程:

1)驗證用戶名、郵箱、手機號、密碼等格式。省略…

2)從服務中取一個ID,假設是115。

3)如果用戶的登錄類型是郵箱(如:$loginName='songhuan@zixue.it'),則在登錄名前加上前綴登錄名結果(如:$loginName='mail_songhuan@zixue.it')

4)求登錄名的HASH值:$loginHash=md5($loginName); 對md5值hash,可以求asc碼,或者用自己的算法,最后得出$loginHash=16位或32位的整數

5)$tableName  = 'user_login' . ($loginHash%100),如果獲取user_login表名,假如結果為user_login88。

$tableName  = 'user_info' . (115%100),如果獲取user_info表名。

6)執行SQL:

復制代碼代碼如下:
INSERT INTO user_login88 (login_name, login_hash, user_id) VALUES ('songhuan@zixue.it', 183239324323, 1); 
INSERT INTO user_info15 (user_id, login_pwd) VALUES (115, 'afieflefiefladifadfadfe');

登錄流程:

 

1)如果用戶的登錄類型是郵箱(如:$loginName='songhuan@zixue.it'),則在登錄名前加上前綴登錄名結果(如:$loginName='mail_songhuan@zixue.it')

2)

復制代碼代碼如下:
$loginHash=ord(md5($loginName));

 

3)

復制代碼代碼如下:
$tableName  = 'user_login' . ($loginHash%100);
假如結果為user_login88

 

4)執行SQL:

復制代碼代碼如下:
SELECT id FROM user_login88 WHERE login_hash = $loginHash;

 

如果查詢不到數據,則登錄名不存在

5)如果能獲取到,id=115,則

復制代碼代碼如下:
$tableName  = 'user_info'.(115%100);

 

SELECT id, pwd … FROM user_info15 WHERE id = 115;

 

6)匹配密碼,如果密碼不相等,返回false

7)如果密碼相等,將用戶ID加密放入COOKIE,將用戶信息存入Memcache.

希望本文所述對大家的php程序設計有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 蒙自县| 蒙山县| 全南县| 永丰县| 普定县| 兴仁县| 红安县| 大庆市| 东平县| 重庆市| 凌海市| 嘉兴市| 饶河县| 丰台区| 阿拉善盟| 平武县| 亚东县| 遵义县| 蛟河市| 苗栗县| 台山市| 石河子市| 施秉县| 安塞县| 原平市| 和林格尔县| 日照市| 宜昌市| 临湘市| 八宿县| 开江县| 潜江市| 得荣县| 漯河市| 永春县| 石嘴山市| 纳雍县| 永胜县| 玉龙| 芷江| 盐池县|