MySql 使用CASE WHEN语法条件性处理数据

假设数据库有字段 id,money1,money2,m1,m2,查询时需要判断mid=m1则累计money1,mid=m2则累计money2,此时可以使用CASE WHEN语法条件性处理数据

SELECT SUM(
    CASE WHEN m1=:id THEN money1 WHEN m2=:id THEN money2 ELSE 0 END
) AS money FROM TABLE
# Tips:匹配m1=:id时,返回money1;匹配m2=:id时,返回money2,否则返回0

PHP session 存储方式

PHP session 存储方式有3种

1)文件存储,file

2)memcahe存储

3)redis存储


1)file(默认方式)

session.save_handler = file  
ssession.save_path = "/tmp"  

第一点设置为使用文件存储session,第二点为默认的存储位置

 


2)memcache

session.save_handler = memcache  
session.save_path = "tcp://127.0.0.1:11211,tcp://Mem服务器2:端口号..."  

使用多个 memcached server 时用逗号","隔开,可以带额外的参数"persistent"、"weight"、"timeout"、"retry_interval" 等,  
类似:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2"  
参考:http://php.net/manual/zh/memcache.addserver.php  

如果安装的PECL是memcached(使用libmemcache库的那个),则配置应为  
ini_set("session.save_handler", "memcached"); // 是memcached不是memcache  
ini_set("session.save_path", "127.0.0.1:11211"); // 不要tcp://  
参数参考:http://php.net/manual/zh/memcached.addserver.php  

 


3)redis

session.save_handler = redis  
session.save_path = "tcp://host1:6379?weight=1, tcp://host2:6379?weight=2&timeout=2.5, tcp://host3:6379?weight=2"  

参数:  
weight 比重  
timeout 超时  
persistent 持久连接 取值 0 1  
prefix session id 前缀  
auth 验证  
database 选择的数据库  

session 以秒表示 生命周期由session.gc_maxlifetime来控制  
ini_set('session.gc_maxlifetime','3600')可改变生存时间,需要SETEX 命令,redis版本至少2.0  

phpredis 也可以链接一个unix domain socket :unix:///var/run/redis/redis.sock?persistent=1&weight=1&database=0  

 


redis实例

ini_set('session.save_handler', 'redis');  
ini_set('session.save_path', 'tcp://127.0.0.1:6379');  
session_start();  
_SESSION['sessionKey'] = 'redis session!';  
var_dump(_SESSION['sessionKey']);  
echo '<br/>';  

redis = new redis();redis->connect('127.0.0.1', 6379);  
//redis用session_id作为key并且是以string的形式存储  
var_dump($redis->get('PHPREDIS_SESSION:' . session_id()));  

参考至https://blog.csdn.net/qq_39780174/article/details/78482943

利用阿里云周边实现SLB+ECS+NAS+RDS负载均衡高并发架构

基本思路:

1.创建自定义专有网络VPC,后续负载均衡SLB、服务器ECS、云数据库RDS都使用同一VPC

2.购买SLB

3.购买ECS一台,记得使用自建专有网络VPC,且不搭建公有网络

4.使用SLB对ECS进行4层协议,监听端口转发到ECS实例1,可访问公网

5.搭建ECS实例1环境,并购买文件存储包,进行快照,创建自定义镜像

6.购买相同配置ECS一台,使用刚才的自定义镜像创建环境

7.使用SLB对两台ECS进行7层协议,监听80端口,实行负载均衡

8.分别对两台ECS实例挂载共享数据盘NAS,并设置自动挂载

9.购买RDS-mysql版本,申请公网地址用于开发,并创建只读实例,使用读写分离地址用于程序

10.在实例1上安装应用程序,程序放置于NAS挂载点上,并把nginx配置复制到实例2上面

11.使用了负载均衡后,会遇到会话保持问题,此时需要做session共享,session共享有3种方式,这里使用第一种

1)利用NAS系统,修改session文件存储位置,存放到共享NAS系统中

2)使用memcache来做共享

3)使用redis来做共享

 

感谢标杆徐教学视频指导 http://medu.51cto.com/course/index/view?id=16806

无限分类-树形结构两种方式

//准备数组,代替从数据库中检索出的数据(共有三个必须字段id,name,pid) 
header("content-type:text/html;charset=utf-8"); 
categories = array( 
 array('id'=>1,'name'=>'电脑','pid'=>0), 
 array('id'=>2,'name'=>'手机','pid'=>0), 
 array('id'=>3,'name'=>'笔记本','pid'=>1), 
 array('id'=>4,'name'=>'台式机','pid'=>1), 
 array('id'=>5,'name'=>'智能机','pid'=>2), 
 array('id'=>6,'name'=>'功能机','pid'=>2), 
 array('id'=>7,'name'=>'超级本','pid'=>3), 
 array('id'=>8,'name'=>'游戏本','pid'=>3), 
); 

/*方法1 利用引用*/
/*第一步 先组建以id为key的数组*/tree = array();
foreach(categories asv){
  tree[v['id']] = v;tree[v['id']]['children'] = array();
}
/*第二部 利用引用,将children添加进去,这样只遍历一次即可*/
foreach(tree as key=>v){
  if(v['pid'] != 0){tree[v['pid']]['children'] = &tree[key];//注意:此处必须传引用否则结果不对
  }
}
/*第三部 删除无用的根节点*/
foreach(tree as key=>v){
  if(v['pid'] !=0 ){
    unset(tree[key]);
  }
}


/*方法2 利用递归*/
function get_attr(arr,pid){tree = array();
  foreach(arr askey=>v){
    if(v['pid'] == pid){v['children'] = get_attr(arr,v['id']);
      if(empty(v['children'])){
        unset(v['children']);//如果为空,则删除,可选
      }
      tree[] =v;
    }
  }
  return tree;
}tree2 = get_attr($categories, 0);