laravel框架session使用教程

laravel是一款php框架了,在使用laravel时会碰到session使用问题了,在使用过程中碰到一些问题与一些应用的例子。

用Laravel开发应用,把原有的代码copy过来,以前的代码session使用了$_SESSION,本以为移植过来可以很好的运行的,因为没有依赖其他的组件,结果出现了这个
Undefined variable: _SESSION

Laravel的session的配置文件配置在 app/config/session.php 中,使用时可以看看 session 配置文件中可用的选项设定及注释。
Laravel 默认使用 file 的方式来实现 session的。她并不用php原生的$_SESSION(php原生的session要看php.ini的位置),所以忽略php相关的session函数,例如session_start(), $_SESSION。Laravel在运行过程中会在app/storage/session/目录写入session的信息,所以这个目录需要有写权限,否者session就无法写入成功。
Laravel除了使用默认的file作为session的实现,还支持cookie, Memcached, Redis 和数据库的后端驱动作为session的实现。必要的时候还需要自己实现一个session的实现方式,比如在微信公众账号和用户的交互,这中session就无法直接使用,因为每次都是微信服务器来请求,无法通过请求的来源来辨别用户。

laravel的session简要API

Session的API还是比较简单的,大家看看中文文档也大概知道是怎么个意思。但是有那么几个还不太好理解。

//session的永久保存(在不过期范围内)
Session::put(‘key’, ‘value’);

//等同于PHP的原生session
$_SESSION[‘key’] = ‘value’;

//get操作
$value = Session::get(‘key’, ‘default’);

//去除操作并删除,类似pop概念
$value = Session::pull(‘key’, ‘default’);

//检测是否存在key
Session::has(‘users’);

//删除key
Session::forget(‘key’);
这个对应只要session不过期,基本上是永久保存,下次http请求也是存在的。不同于下面的flash概念。
laravel的session中flash概念
但是Laravel出了个快闪flash的概念,把我一下子给搞混了。这个flash两次请求有效(本次和下次请求有效),与本次请求取操作多少次无关。

//保存key,value
Session::flash(‘key’, ‘value’);

//取值方法还是一样的
Session::get(‘key’);

//刷新快闪数据时间,保持到下次请求
Session::keep(array(‘username’, ’email’));
这个flash的概念和上面的put的概念不太一样。

put :这个对应只要session不过期,基本上是永久保存,下次请求也是存在的。
flash :保存的值,本次请求可以使用,下次http请求可以使用,再下一次就不存在了。
也就是说下一次的请求用完就被销毁了,不会让session的值变的越来越大,可以保存一些临时的数据。

这中情况的使用场景比如有:
用户请求了页面,出现错误信息,重定向到一个新的页面,需要展示之前的数据。(虽然可以通过url参数来传递,处理不好可能会有xss漏洞)。

用户访问了一个页面,过滤器发现没权限,保存当前页面url,重定向到登录页面,登录成功,取出值,重定向到原先的页面。(这里可能需要刷新保存的快闪数据)

session落地的时间
我天真的以为使用了Session::put函数就能保存这个变量了。于是我的代码这样写:

class LoginController {

public function login(){
Session::put(‘key’,’value’);
print_r( Session::all() ); //取出来看看是否put成功
exit; //习惯性的调试都exit,不执行后续代码
//return Redirect::to(/); 框架在return后还会有后续的代码执行的
}
}

结果下次请求就是找不到本次的Session,而且看app/storage/session目录就是没有文件生成。总感觉不对劲啊。

后来看到网络上有个方法Session::save(),于是我也用了下,居然发现成功的生成了session的文件。于是我感觉到,Laravel不用php原生的session,那么在controller之后应该做了一些事情,将session写入到文件中,而不是每次put操作都写操作,这样会IO操作太频繁的,影响性能的。

查看调用相关的代码。laravel编译后,在bootstrap/compiled.php中

class Middleware implements HttpKernelInterface
{

public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
{
$this->checkRequestForArraySessions($request);
if ($this->sessionConfigured()) {
$session = $this->startSession($request); // 启动session
$request->setSession($session);
}
$response = $this->app->handle($request, $type, $catch); // 调用controller的method
if ($this->sessionConfigured()) {
$this->closeSession($session); //关闭session
$this->addCookieToResponse($response, $session);
}
return $response;
}

protected function closeSession(SessionInterface $session)
{
$session->save(); // 保存session
$this->collectGarbage($session);
}
}
小提示:如果不知道函数调用情况,可以在controller中throw new Exception();,然后在/config/app.php的debug更改为debug=>true。可以看到函数的调用关系。

可以看见,在调用完controller之后,调用了session->save()的方法,来主动的保存session。这样session才能落地保存起来,如果在controller或者view里面写了exit;,
那么session是不会被保存的,除非主动的写Session::save()才能手工的保存起来。因此在debug调试的时候千万要注意啊。

 

 

转载自:http://www.cnblogs.com/qhorse/p/4763169.html

php 数组 类对象 值传递 引用传递 区别

php中,数组是当一个普通变量,值传递是要一个实参的一个拷贝副本,跟实参无关,引用传递后可以改变实参的值

而类的对象是无论值传递和引用传递都是引用传递,是对对象的引用,都会改变实参的值

结合clone函数就不难理解PHP对对象的传递是类似指针传递

对象的值传递和引用传递在特定场景下面是有区别的

Centos 7 配置PPTP VPN攻略

准备工作:

1、一台centos7主机,内网ip 192.*.*.*

2、一个连接外网的路由器,外网固定ip 210.*.*.*  DNS 210.*.*.*

开始安装:

1、更新centos7主机

1
2
yum update –y
reboot #重启

2、检测系统环境

1
modprobe ppp-compress-18 && echo success

显示success说明系统支持MPPE补丁,如果不支持,需要先安装kernel-devel

# yum install kernel-devel

检查系统是否开启TUN/TAP支持

1
cat /dev/net/tun

显示结果为下面的文本,则表明通过:

cat:/dev/net/tun: File descriptor in bad state

检查系统是否开启ppp支持

1
cat /dev/ppp

显示结果为下面的文本,则表明通过:

cat:/dev/ppp: No such device or address

上面三条必须同时满足,否则不能安装pptp vpn

3、关闭SELINUX

1
2
3
4
5
vi /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
setenforce 0 #使配置立即生效

4、更新epel(参考 http://mannerwang.blog.51cto.com/12009183/1852806

1
2
yum makecache #更新yum缓存
yum repolist #查看yum源,会多一个epel源

5、安装iptables、ppp、pptpd

1
yum install -y ppp iptables pptpd

6、配置pptp参数

1
vi /etc/ppp/options.pptpd

找到 ms-dns两行,将注释#去掉,并改为如下

ms-dns 210.*.*.*(公司外网DNS、可以使用114、8等通用DNS)

ms-dns 8.8.8.8

7、设置pptp拨号用户和密码(可以设置多个用户,每行一个)

1
2
3
vi /etc/ppp/chap-secrets
#client          server   secret                   IP addresses
vpntest          pptpd    123456                   *

*表示为客户端自动分配IP地址

8、设置pptp服务器IP地址,设置vpn拨入客户端ip地址池

1
2
3
vi /etc/pptpd.conf
localip 172.16.36.1  #设置pptp虚拟拨号服务器IP地址(注意:不是服务器本身的IP地址)
remoteip 172.16.36.2-254  #为拨入vpn的用户动态分配IP地址

这里有个坑是最后一行需要为空内容,原因目前未知..

9、启动服务

1
2
3
systemctl start pptpd.service #启动pptp
systemctl status pptpd.service #查看pptp状态
systemctl enable pptpd.service #设置开机启动

10、修改内核转发参数

1
2
3
vi /etc/sysctl.conf  #编辑
net.ipv4.ip_forward = 1  #设置为1
/sbin/sysctl -p  #使设置立刻生效

11、修改防火墙规则—重点内容

1
systemctl start iptables.service #启动防火墙

开机启动:chkconfig iptables on

编辑配置文件,以下为我的配置,请自行对比默认配置参考

主要是添加1723端口和gre协议.不推荐SHELL运行,建议直接编辑配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
vi /etc/sysconfig/iptables
#sample configuration for iptables service
#you can edit this manually or use system-config-firewall
#please do not ask us to add additional ports/services to this defaultconfiguration
 
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
 
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW,RELATED,ESTABLISHED -m tcp --dport 22 -jACCEPT
-A INPUT -p tcp -m state --state NEW,RELATED,ESTABLISHED -m tcp --dport 1723 -jACCEPT
-A INPUT -p gre -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i ppp+ -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -m state --state INVALID -j DROP
-A OUTPUT -m state --state INVALID -j DROP
 
COMMIT
#completed on 2016-9-18 15:33:54
 
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 172.16.36.0/24 -o eno16777984 -j MASQUERADE
COMMIT
#completed on 2016-9-18 15:33:54

由于centos7中的iptables规则重启失效,添加到local文件中

vi /etc/rc.d/rc.local #在文件末尾添加此行代码

1
iptables -t nat -A POSTROUTING -s 172.16.36.0/24 -o eno16777984 -j MASQUERADE

上面有2处需要注意,两个POSTROUTING字段都使用了本机的网卡名称,其中eno16777984是虚拟主机网卡,而不是传统上的eth0,务必注意!

重启iptables使得规则生效

systemctl restart iptables.service

查看路由表及iptables规则

1
2
3
4
5
6
7
8
9
10
iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  172.16.36.0/24       anywhere
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
iptables -t filter -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere             state NEW,RELATED,ESTABLISHED tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             state NEW,RELATED,ESTABLISHED tcp dpt:pptp
ACCEPT     gre  --  anywhere             anywhere             state NEW,RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             state NEW,RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
DROP       all  --  anywhere             anywhere             state INVALID
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere             state INVALID

坑点又来了,iptables启动时默认是不加载模块的,这样就会导致连接时报619无法验证密码的错误

加载iptables模块

1
2
modprobeip_nat_pptp
modprobeip_conntrack_pptp

查看模块是否加载

1
2
3
4
5
6
7
lsmod|grep pptp
nf_nat_pptp            13115  0
nf_nat_proto_gre       13009 1 nf_nat_pptp
nf_conntrack_pptp      19257 1 nf_nat_pptp
nf_conntrack_proto_gre    14287 1 nf_conntrack_pptp
nf_nat                 26146  4nf_nat_proto_gre,nf_nat_ipv4,nf_nat_pptp,nf_nat_masquerade_ipv4
nf_conntrack          105745  8nf_conntrack_proto_gre,nf_nat,nf_nat_ipv4,nf_nat_pptp,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4,nf_conntrack_pptp

如果想让iptables自动加载以上模块,可以编辑

1
vi /etc/sysconfig/iptables-config

在IPTABLES_MODULES=””字段中添加以上模块。

IPTABLES_MODULES=”ip_nat_pptp ip_nat_proto_gre”

重启iptables即可

12、安装net-tools,查看1723端口

1
2
3
yuminstall -y net-tools
netstat -nap | grep 1723 | grep pptpd
tcp        0      0 0.0.0.0:1723            0.0.0.0:*               LISTEN      1070/pptpd

13、在路由器侧配置端口及外网ip,这个要看各自的路由本身的操作了,可能还需要配置路由表,将172.16.36.0加到表中.

查看pptp服务状态

systemctl status pptpd.service

systemctl status iptables.service

要保证的服务:

pptpd可以自启动

iptables可以自启动并加载转发、gre模块

经过如上一系列操作,系统PPTP搭建成功,且重启后服务即刻启动。

通信分析:

外网用户通过210 的PPTP外网映射ip及账号密码默认端口访问到内网192 PPTP主机并获得172 的IP

访问内网页面时,192的请求指向172 VPN并由内网PPTP主机将172 IP nat到内网192 并返回数据,实现VPN的功能,,,也不知道我说得对不对

Q&A:

1、为什么选择pptp而不是openvpn?因为后者还没研究成果…

2、关于吞吐量、关于安全—目前还在研究,包括iptables的规则也需要细化

3、PPTP支持同一用户多地重复连接

4、连接多个不同VPN时是否有安全隐患–一般没有,可以设置路由表对网络通信进行区分

本文参考了如下作者内容,表示感谢!

http://www.wanghailin.cn/centos-7-vpn/

http://www.osyunwei.com/archives/7407.html

http://www.111cn.net/sys/linux/86641.htm

http://www.centoscn.com/image-text/install/2014/1201/4211.html

http://www.tuicool.com/articles/uu6NJb

 

转载自: http://mannerwang.blog.51cto.com/12009183/1854931/

PHPExcel 行号、数字互转

$a = PHPExcel_Cell::columnIndexFromString(‘A’);

// $a = 1;

$b = PHPExcel_Cell::stringFromColumnIndex(0);

// $b = ‘A’;

注意,这两个方法的起始数字 一个是1 一个是0