Session 的工作机制
客户端第一次访问某服务器,为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,亦或通过 URL 进行传导。
sessionID的生产算法原理如下:
hash\_func = md5 / sha1 #可由php.ini配置 sessionID = hash\_func(客户端IP + 当前时间(秒)+ 当前时间(微妙)+ PHP自带的随机数生产器)
hash\_func(*)中的数据采样值的内容分析,多个用户在同一台服务器时所生产的sessionID重复的概率极低(至少为百万份之一)。
黑客如果要猜出某一用户的sessionID,则他也必须知道“客户端IP、当前时间(秒、微妙)、随机数”等数据方可模拟。
php.ini配置如下:
; Select a hash function for use in generating session ids.
; Possible Values
; 0 (MD5 128 bits)
; 1 (SHA-1 160 bits)
; This option may also be set to the name of any hash function supported by
; the hash extension. A list of available hashes is returned by the hash_algos()
; function.
; http://php.net/session.hash-function
session.hash_function=0
PHP session工作原理
session 技术相当于Cookie技术的升级版,Cookie的工作机制是将信息记录在客户端,而Session技术是将信息存放在服务器端,服务器存储信息的方式有很多,可以是文件、数据库和内存等,这里以文件的存储方式介绍session的工作步骤。
(1)客户端第一次访问某服务器。
(2)服务器通过Cookie发送sessionID给客户端,并在服务器建立一个与sessionID同名的文件用于存储信息,而sessionID不能重复,即不同的客户端的sessionID是不同的。
(3)客户端再次访问服务器时会携带服务器发送给客户端的sessionID。
(4)服务器根据客户端发送的sessionID查找对应的文件,读取文件内容。
通过上面的步骤可以看出,session的工作依赖cookie的工作,当然不用Cookie也可以实现sessionID的传递,如URL,但是用cookie最方便。
PHP本身的session是如何工作的呢
首先,在需要共享客户端信息的文件中通过session\_start()函数开启session, 然后就可以向$\_SESSION全局数组中存入或读取数据,而$\_SESSION数组与其他数组不同的是,当向该数组中添加数据时,PHP还会将其中的数据系列化写入session文件中,每次开启session时,PHP会将session文件中的数据读取到该全局数组中,实现数据共享的功能。
php\_cli模式通过session\_id()使用session
可以通过它来获取当前会话的PHPSESSID,也可以通过它来设置当前的会话PHPSESSID。 php\_cli模式下可以通过设置这个,达到使用session的目的,非常方便。
例如:
<?php
// session_id('vingbrv8m64asth0nhplu9gmb7');
session_start();
$_SESSION[md5(rand(100,999))] = rand(100,999);
var_dump($_SESSION);
下面看看一个实际例子,助你加强对session的认识
//SESSION初始化的时候调用
function open($save_path, $session_name)
{
global $sess_save_path;
$sess_save_path = $save_path;
return(true);
}
//关闭的时候调用
function close()
{
return(true);
}
function read($id)
{
global $sess_save_path;
$sess_file = "$sess_save_path/sess_$id";
return (string) @file_get_contents($sess_file);
}
//脚本执行结束之前,执行写入操作
function write($id, $sess_data)
{
echo "sdfsf";
global $sess_save_path;
$sess_file = "$sess_save_path/sess_$id";
if ($fp = @fopen($sess_file, "w")) {
$return = fwrite($fp, $sess_data);
fclose($fp);
return $return;
} else {
return(false);
}
}
function destroy($id)
{
global $sess_save_path;
$sess_file = "$sess_save_path/sess_$id";
return(@unlink($sess_file));
}
function gc($maxlifetime)
{
global $sess_save_path;
foreach (glob("$sess_save_path/sess_*") as $filename) {
if (filemtime($filename) + $maxlifetime < time()) {
@unlink($filename);
}
}
return true;
}
补充--涉及到的函数
session_start();// 开启session回话,其中session_id()的值是一次独立会话的标志
session_name(); // 默认是PHPSESSID,在php.ini文件中可以自行配置。
session_id(); // 在cookie中的体现是,session_name为键,session_id为值
setcookie(); // 要想起作用,必须有页面的刷新
session_destory(); // session_destroy — 销毁一个会话中的全部数据
Comment here is closed