php+mysql大量用户登录解决方案分析

所属分类: 网络编程 / PHP编程 阅读数: 368
收藏 0 赞 0 分享

本文实例分析了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程序设计有所帮助。

更多精彩内容其他人还在看

php获取数据库结果集方法(推荐)

下面小编就为大家带来一篇php获取数据库结果集方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

php从数据库中读取特定的行(实例)

下面小编就为大家带来一篇php从数据库中读取特定的行(实例)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

php使用PDO从数据库表中读取数据的实现方法(必看)

下面小编就为大家带来一篇php使用PDO从数据库表中读取数据的实现方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

详解PHP5.6.30与Apache2.4.x配置

这篇文章主要介绍了详解PHP5.6.30与Apache2.4.x配置,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Yii 2.0中场景的使用教程

这篇文章主要给大家介绍了关于Yii 2.0中场景使用的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
收藏 0 赞 0 分享

Yii2中简单的场景使用介绍

这篇文章主要给大家介绍了关于Yii2中简单的场景使用的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来跟着小编一起学习学习吧。
收藏 0 赞 0 分享

在PHP 7下安装Swoole与Yar,Yaf的方法教程

周末闲来无事,玩玩swoole,所以下面这篇文章主要给大家介绍了在PHP 7下安装Swoole与Yar,Yaf的方法教程,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
收藏 0 赞 0 分享

总结一些PHP中好用但又容易忽略的小知识

这篇文章主要给大家总结了一些在日常工作发现的,PHP中好用但又容易被人们忽略的小知识,例如PHP函数之判断函数是否存在、PHP函数之可变函数等等,需要的朋友们下面跟着小编来一起看看详细的介绍吧。
收藏 0 赞 0 分享

PHP手机号中间四位用星号*代替显示的实例

本篇文章主要介绍了PHP手机号中间四位用星号*代替显示的实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Windows 下安装 swoole 图文教程(php)

下面小编就为大家带来一篇Windows 下安装 swoole 图文教程(php)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享
查看更多