PHP之session与cookie
1、session与cookie的关系
众所周知,session是存储在服务器端,cookie是存储在客户端,如果禁用了浏览器的cookie功能,很多时候(除非进行了特殊配置)服务器端就无法再读取session,这是为什么哪?
服务器端区分session是通过session_id,这就需要客户端在发起http请求时,把session_id传送过来,如果浏览器如果开启了cookie,当session_id从服务器被返回时,就会被浏览器存储到cookie中,当再次发送http请求时,就会将cookie中的内容写入到http head中,如果禁用了cookie,服务器就会认为是一个新的客户端发起的请求,就会创建一个新的session会话。
如果禁用了cookie,可以通过url参数的形式传输给服务器,如下:
ini_set('session.use_cookies',0); ini_set('session.use_only_cookies',0); ini_set('session.use_trans_sid',1);
2、session以文件存储时,分目录存放
如果把session存放到一个目录下,当session文件特别多时,文件的搜索非常耗时,一般的解决方案是,自定义session handler,将session存储到内存中或者数据库中,第二个方案是,分多级目录存放session。第一种方案,如果存在内存中,需要安装memcache等内存管理工具。php本身支持session多级目录存放,只需要简单的修改一下配置文件即可,修改方法如下:
session.save_path = “2;777;D:/session”;各个参数含义:2:创建二级目录 777:权限(可读、可写、可执行)D:/session session存放目录
该配置就会将session分为两级目录,每个目录有16个子目录[0-f],不过好像PHP session不支持创建目录,你需要事先把那么些目录创建好 。
*注意:二级目录php不会自动创建,需要ext/session下的工具生成,或者用代码生成,生成二级目录的程序如下:
$str='0123456789abcdefghijklmnopqrstuvwxyz'; $len=strlen($str); for($i=0;$i<$len;$i++){ for($j=0;$j<$len;$j++){ $dirname='d:/session/'.$str[$i].'/'.$str[$j]; if(!file_exists($dirname)){ mkdir($dirname,0777,true) && print('成功创建目录'.$dirname); } } }