Session 的工作机制
客户端第一次访问服务器,为每个访问者创建一个唯一的id (UID),并基于这个UID存储变量。uid存储在cookie中或通过URL传输。
sessionID的生产算法原理如下:
hash _ func=MD5/sha1 # session id=hash _ func(客户端IP当前时间(秒)当前时间(细微)PHP自带的随机数生成器)可以通过php.ini进行配置
根据hash_func(*)中数据采样值的内容分析,同一台服务器上多个用户产生重复sessionID的概率极低(至少百万分之一)。
黑客要想猜出用户的sessionID,在模拟之前还必须知道“客户端IP、当前时间(秒、微妙)、随机数”等数据。
php.ini配置如下:
;选择用于生成会话id的哈希函数。
;可能的值
;0 (MD5 128位)
;1 (SHA-1 160位)
;此选项也可以设置为支持的任何哈希函数的名称
;哈希扩展。hash_algos()返回可用哈希的列表
;功能。
;http://php.net/session.hash-function
session.hash_function=0
PHP session工作原理
会话技术相当于Cookie技术的升级版本。Cookie的工作机制是在客户端记录信息,而会话技术是在服务器端存储信息。服务器存储信息的方式有很多,比如文件、数据库和内存。这里从文件存储的角度介绍Session的工作步骤。
(1)客户端第一次访问服务器。
(2)服务器通过Cookie将sessionID发送给客户端,并在服务器中创建一个与sessionID同名的文件来存储信息,但sessionID不能重复,即不同客户端的sessionID不同。
(3)当客户端再次访问服务器时,会携带服务器发送给客户端的sessionID。
(4)服务器根据客户端发送的sessionID搜索对应的文件,读取文件内容。
从以上步骤可以看出,session的工作依赖于cookies的工作。当然,sessionID可以在没有cookie的情况下传输,比如URL,但是cookie是最方便的。
PHP本身的session是如何工作的呢
首先,在需要共享客户端信息的文件中通过session_start()函数打开会话,然后将数据保存或读取到$_SESSION全局数组中。与其他数组不同,PHP在向数组中添加数据时会将数据序列化到会话文件中。每次打开会话,PHP都会将会话文件中的数据读入全局数组,实现数据共享的功能。
php_cli模式通过session_id()使用session
可以用来获取当前会话的PHPSESSID,也可以用来设置当前会话的PHPSESSID。在php_cli模式下,可以通过设置这个来达到使用session的目的,非常方便。
例如:
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
//session _ id(' vingbrv 8m 64 asth 0 nhplu 9 gmb 7 ');
session _ start();
$_SESSION[md5(rand(100,999))]=rand(100,999);
var _ dump($ _ SESSION);
下面看看一个实际例子,助你加强对session的认识
//初始化时调用SESSION。
函数open($save_path,$session_name)
{
全局$ sess _ save _ path
$ sess _ save _ path=$ save _ path
返回(真);
}
//关闭时调用。
功能关闭()
{
返回(真);
}
函数读取($id)
{
全局$ sess _ save _ path
$ sess _ file=' $ sess _ save _ path/sess _ id ';
return(string)@ file _ get _ contents($ sess _ file);
}
//在脚本执行结束前执行写操作。
函数write($id,$sess_data)
{
echo“SDF SF”;
全局$ sess _ save _ path
$ sess _ file=' $ sess _ save _ path/sess _ id ';
if ($fp=@fopen($sess_file,' w '){ }
$return=fwrite($fp,$ sess _ data);
fc lose(FP美元);
return $ return
} else {
返回(假);
}
}
函数销毁($id)
{
全局$ sess _ save _ path
$ sess _ file=' $ sess _ save _ path/sess _ id ';
return(@ unlink($ sess _ file));
}
函数gc($maxlifetime)
{
全局$ sess _ save _ path
foreach(glob($ sess _ save _ path/sess _ *)作为$ filename){ 0
if(file mtime($ filename)$ max lifetime time()){ 0
@ unlink($ filename);
}
}
返回真;
}
补充涉及到的函数
session _ start();//打开会话回复,其中session_id()的值是独立会话的符号。
session _ name();//默认为PHPSESSID,可以在php.ini文件中自行配置。
session _ id();//在cookie中,session_name是密钥,session_id是值。
setcookie();//要记住该功能,必须刷新页面。
session _ destory();//session _ destroy-销毁会话中的所有数据。
下一篇:没有了