假设数据库有字段 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
假设数据库有字段 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 存储方式有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
基本思路:
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);