phpsession目录
‘壹’ 为什么设置php的session
一、介绍
PHP中session默认过期时间是1440S,超过这个时间没有页面刷新或者用户关闭了浏览器,session就会失效。
二、设置
session文件存储在服务器端,通过保存在用户端的SessionId与服务键液戚器进行交互,session的配置文件是php.ini,相关参数如下:
1.session.use_cookies = 1,默认1,代表SessionId通过cookie来传递,否则会用Query_String
2.session.name = PHPSESSID,默认PHPSESSID,代表SessionID储存的变量名称,可能是Cookie,也可能是Query_String来传递
3.session.cookie_lifetime = 604800,是SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID立即失效,这里我设置了7天
4.session.gc_maxlifetime = 604800,默认是1440,代表session在服务器端保留的时间,超过这个时间就会失效。这里我设置了7天,与客户端的cookie有效时间一致
三、其他情况
一般情况下把这四个值设置好之后就可以更改session的有效期了,但是当多个站点的session文件都保存在公用埋桐临时路径时,由于php的GC(Garbage Collector)机制,某个站点启动垃圾回收机制,都会把公用临时文件目录下的文件全部清除,这就会导致稿陵session失效,解决方法就是更改php.ini里session文件的保存路径:
session.save_path=‘你的路径’;
‘贰’ 求救:主机的php.ini中的session.save_path设置
php.ini中的session配置说明 下面介绍能让session运行的必要配置步骤手动配置PHP运行环境时,最容易遗忘的一项是服务器端session文件的存储目录配置工作,打开php.ini文件,搜索Session,找到session.save_path,默认值为/tmp,代表session文件保存在c:/tmp目录下,默认tmp目录并没有创建,你可以在c盘下创建tmp目录,或者创建一个其他目录,比如leapsoulcn,再修改session.save_path的值,并去掉;,即session.save_path = ‘/leapsoulcn’;注意事项:1、一般为了保证服务器的安全,session.save_path值最好设置为外网无法访问的目录,另外如果你是在linux服务器下进行session配置,请务必同时配置此目录为可读写权限,否则在执行session操作时会报错。2、在使用session变量时,为了保证服务器的安全性,最好将register_globals设置为off,以保证全局变量不混淆,在使用session_register()注册session变量时,你可以通过系统全局变量$_SESSION来访问,比如你注册了leapsoulcn变量,你可以通过$_SESSION['leapsoulcn']来访问此变量。session.save_path配置其他说明事项,从php.ini配置文件翻译而来你可以使用”N;[MODE;]/path”这样模式定义该路径,N是一个整数,表示使用N层深度的子目录,而不是将所有数据文件都保存在一个目录下。[MODE;]可选,必须使用8进制数,默认600(=384),表示每个目录下最多保存的会话文件数量。[MODE;]并不会改写进程的umask。php不会自动创建这些文件夹结构。可使用ext/session目录下的mod_files.sh脚本创建。如果该文件夹可以被不安全的用户访问(比如默认的”/tmp”),那么将会带来安全漏洞。当N>0时自动垃圾回收将会失效,具体参见下面有关垃圾搜集的部分。如果你服务器上有多个虚拟主机,建议针对每个不同的虚拟主机分别设置各自不同的目录。至此最基本的session配置就完成了,你只要保存php.ini,并重启apache,即可使用session功能。其他session配置说明session.save_handler = ”files”默认以文件方式存取session数据,如果想要使用自定义的处理器来存取session数据,比如数据库,用”user”。session.use_cookies = 1是否使用cookies在客户端保存会话sessionid,默认为采用cookiessession.use_only_cookies = 0是否仅仅使用cookie在客户端保存会话sessionid,这个选项可以使管理员禁止用户通过URL来传递id,默认为0,如果禁用的话,客户端如果禁用Cookie将使session无法工作。session.name = “PHPSESSID”当做cookie name来使用的session标识名session.auto_start = 0是否自动启动session,默认不启动,我们知道在使用session功能时,我们基本上在每个php脚本头部都会通过session_start()函数来启动session,如果你启动这个选项,则在每个脚本头部都会自动启动session,不需要每个脚本头部都以session_start()函数启动session,推荐关闭这个选项,采用默认值。session.cookie_lifetime = 0传递sessionid的Cookie有效期(秒),0表示仅在浏览器打开期间有效。session.gc_probability = 1session.gc_divisor = 100定义在每次初始化会话时,启动垃圾回收程序的概率。计算公式如下:session.gc_probability/session.gc_divisor,比如1/100,表示有1%的概率启动启动垃圾回收程序,对会话页面访问越频繁,概率就应当越小。建议值为1/1000~5000。session.gc_maxlifetime = 1440设定保存的session文件生存期,超过此参数设定秒数后,保存的数据将被视为’垃圾’并由垃圾回收程序清理。判断标准是最后访问数据的时间(对于FAT文件系统是最后刷新数据的时间)。如果多个脚本共享同一个session.save_path目录但session.gc_maxlifetime不同,将以所有session.gc_maxlifetime指令中的最小值为准。如果你在session.save_path选项中设定使用子目录来存储session数据文件,垃圾回收程序不会自动启动,你必须使用自己编写的shell脚本、cron项或者其他办法来执行垃圾搜集。比如设置”session.gc_maxlifetime=1440″ (24分钟):cd /path/to/sessions; find -cmin +24 | xargs rm以上是一些常用的session配置选项说明,更多的session配置选项说明你可以参考php.ini文件中的说明。至此,在php.ini配置文件中对session进行配置的PHP教程就介绍完毕了,通过上面的步骤实践与学习,基本的session功能都可以使用,至于session性能等其他方面则需要根据服务器环境和需求进行微调了,这个得自己体会。
‘叁’ php.ini中的session如何设置
php.ini设置参考项:
//处理session存取的模式
session.save_handler = files
//session档案存放路径
session.save_path = /tmp
//session使用cookie的功能,启动: 1
session.use_cookies = 1
//session名字
session.name = PHPSESSID
//自动启动;0:关;1:开启
session.auto_start = 0
//session使用cookie的生存期,以秒为单位
session.cookie_lifetime = 0
‘肆’ php session是怎样生成的
session是在服务器端保持用户会话数据的一种方法,对应的cookie是在客户端保持用户数据。HTTP协议是一种无状态协议,服务器响应完之后就失去了与浏览器的联系,最早,Netscape将cookie引入浏览器,使得数据可以客户端跨页面交换,那么服务器是如何记住众多用户的会话数据呢?
首先要将客户端和服务器端建立一一联系,每个客户端都得有一个唯一标识,这样服务器才能识别出来。建议唯一标识的方法有两种:cookie或者通过GET方式指定。默认配置的PHP使用session的时会建立一个名叫”PHPSESSID”的cookie(可以通过php.ini修改session.name值指定),如果客户端禁用cookie,你也可以指定通过GET方式把session id传到服务器(修改php.ini中session.use_trans_sid等参数)。
我们查看服务器端session.save_path目录会发现很多类似sess_vv9lpgf0nmkurgvkba1vbvj915这样的文件,这个其实就是session id “vv9lpgf0nmkurgvkba1vbvj915″对应的数据。真相就在这里,客户端将session id传递到服务器,服务器根据session id找到对应的文件,读取的时候对文件内容进行反序列化就得到session的值,保存的时候先序列化再写入。
事实就是这样,所以如果服务器不支持session或者你想自定义session,完全可以DIY,通过PHP的uniqid生成永不重复的session id,然后找个地方存储session的内容即可,你也可以学flickr把session存储在MySQL数据库中。
‘伍’ PHP提高SESSION响应速度的方法有哪些
1、设置多级目录存储SESSION
默认session的存储目录是1级目录,如果用户量比较大,session文件数量就比较大,我们可以设置目录数为2,使用2级目录可以提交查找和存取速度。不过这种方式对速度的提升一般不是很明显,可以通过修改php.ini,进而修改session存储目录数。
session.save_path = "2;/tmp"2、将SESSION存储到redis中
php中的session默认是存储在文件中的,支持redis存储方式,因为redis的键值数据时存储在内存中的,可以提高session的存取速度。
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"3、及时释放SESSION文件锁
我们在使用session时,需要先执行session_start()函数。
session_start()函数的作用如下:
判断http请求是否包含名为PHPSESSID的cookie,如果没有则创建该cookie并写入到http响应的头文件。
通过PHPSESSID查找对应的session文件,以读写方式打开的文件,然后读取里面的数据到内存。
然后我们一般会通过$_SESSION这个超全局变量,读取或者设置session的值,我们操作的时候,session的值都是保存在内存中的,默认在页面执行完毕之后,才会写入到对应的文件中。
我们通过下面的一段代码测试这个过程:
SESSION执行过程分析:
include "session_function.php";
//session_function.php代码在附录
session_start();
$_SESSION['name']="koastal";
echo "<br/>html content<br/>";
var_mp($_SESSION);
echo "<br/>";输出结果:
open
read
html content
array (size=1)
'name' => string 'koastal' (length=7)
shutdown
write
close通过上面的例子可以发现,在页面执行的过程中(页面的执行过程是指将php文件解析为对应的html文件的耗时,而不是用户在该页面上的停留时间),session文件是被锁定的。
推荐教程:PHP视频教程
‘陆’ php中session作用域的问题,如下图,框架是library中的内容,现在给ad配一个域名,给admin配一个域名
在php中,服务器端和客户端之间的session是通过一个session_id来联系($_COOKIE['PHPSESSID'],这个PHPSESSID可以通过session_name()修改),并且session数据是以普通文件的形式保存在一个特定的文件夹里。
所以说,只要是同一台服务器,session数据目录相同,且两个域名使用了同一个session_id,那么两个域名就会共享session。
如果使用不同session的话,建议在两个域名进入的时候先使用session_destroy()清除原有的session_id,然后再重新session_start()生成新的session_id,这样就不会出现两个站点共享session的情况了。