支持在PHP中在并发访问时由一个方法来保存某些数据.从而使你能够构建更多的定制程序 从而提高你的web网站的吸引力.如果你打开了session.auto_start那么将对象放入会话的唯一方法是使用auto_prepend_file来加载定义这个对象的类,其中,在加载的定义的类时,你不得不使用serialize()你的对象,并且事后unserialize()它.
$_SESSION(和所有已注册得变量)将被PHP使用内置的序列化方法在请求完成时进行序列化.序列化方法可以通过session.serialize_handler这个PHP配置选项中来设置一个指定的方法.注册的变量未定义将被标记为未定义.在并发访问时,这些变量不会被会话模块 定义除非用户后来定义了它们.因为会话数据是被序列化的,resource变量不能被存储在会话中
通过为每个独立用户分配唯一的会话ID,可以实现针对不同用户分别存储数据的功能。会话通常被用来在多个页面请求之间保存及共享信息。 一般来说,会话ID通过cookie的方式发送到浏览器,并且在服务器端也是通过会话ID来取回会话中的数据。如果请求中不包含会话ID信息,那么PHP就会创建一个新的会话,并为新创建的会话分配新的ID。
配置session基本信息
// 指定会话名以用做cookie的名字。只能由字母数字组成,默认为PHPSESSID
session.name
// 指定会话cookie的路径。默认为/
session.cookie_path
// 指定会话cookie的域名。默认为无,表示根据cookie规范产生cookie的主机名
session.cookie_domain
配置sessionID
// 指定是否启用透明SID支持。默认为 0(禁用),禁用会话ID透传机制可以避免会话ID注入以及泄漏,有效的提高会话安全性
session.use_trans_sid
// 指定生成会话ID的散列算法,'0' 表示 MD5(128 位),'1' 表示 SHA-1(160 位);从PHP 5.3.0开始,还可以指定哈希扩展提供的任何算法(如果可用),可以使用hash_algos()函数获取支持列表
session.hash_function
// 指定会话ID字符串的长度。会话ID的长度可以在22到256之间 。默认值为32。如果需要兼容性,可以指定32、40等。更长的会话ID很难猜测。建议至少32个字符
session.sid_length
// 指定编码的会话ID字符中的位数。可能的值为'4'(0-9,af),'5'(0-9,av)和'6'(0-9,az,AZ,“-”,“,”)。 默认值为4。位数越多,会话ID越强。对于大多数环境,建议值为5
session.sid_bits_per_character
配置session管理器程序
// 定义用于存储和检索与会话关联的数据的处理程序的名称。默认为files
session.save_handler
// 定义传递给存储处理器的参数。如果选择了默认的files文件处理器,则此值是创建文件的路径,默认为/tmp
session.save_path
配置Session时间
// 指定过了多少秒之后数据就会被视为“垃圾”并被清除
session.gc_maxlifetime
// 以秒数指定了发送到浏览器的cookie的生命周期。值为0表示“直到关闭浏览器”。默认为 0。
session.cookie_lifetime
配置session安全
// 指定模块是否将使用严格会话ID模式。如果启用此模式,则模块不接受未初始化的会话ID。如果从浏览器发送了未初始化的会话ID,则会将新的会话ID发送到浏览器。通过采用严格模式的会话采用保护应用程序免受会话固定。默认为0(禁用),启用对于常规会话安全是必需的
session.use_strict_mode
// 指定是否在客户端用cookie来存放会话 ID。默认为1(启用)
session.use_cookies
// 指定是否在客户端仅仅使用cookie来存放会话ID。启用此设定可以防止有关通过URL传递会话ID的攻击。默认值为1(启用)
session.use_only_cookies
// 将Cookie标记为只能通过HTTP协议访问。这意味着无法通过脚本语言(例如JavaScript)访问cookie。此设置可以有效地帮助通过XSS攻击减少身份盗用(尽管并非所有浏览器都支持此功能)
session.cookie_httponly
// 允许服务器断言不应将Cookie与跨站点请求一起发送。此断言允许用户代理减轻跨域信息泄漏的风险,并提供针对跨站点请求伪造攻击的某种保护。请注意,并非所有浏览器都支持此功能。空值表示将不会设置SameSite cookie属性。 Lax并Strict表示将不会针对POST请求跨域发送Cookie;Lax会发送Cookie来进行跨域GET请求,而Strict不会发送。
session.cookie_samesite
两种方式传送会话ID
Cookies
URL参数
启动会话
// 使用前缀$prefix创建新的会话ID,前缀允许包含a-z a-z 0-9、(逗号)和-(减号);失败返回false
$session_id = session_create_id($prefix='');
// 设置当前会话ID,不指定将自动设置ID,返回值为session_id
session_id($session_id);
// 设置当前会话的保存路径,不指定为默认,返回值为保存路径
session_save_path($path);
// 设置当前会话名称,不指定为默认,返回值为会话名称,如果设置新名称,返回值是原来的名称
session_name($name);
// 创建新会话或者重用现有会话,如果通过GET或者POST方式,或者使用cookie提交了会话ID,则会重用现有会话;使用函数时将自动调用会话管理器
// 数据会填充超级全局变量$_SESSION中,返回值为bool
// array是会话配置项,键名不需要包含session. 前缀
session_start(array());
// 替换session_id且不修改会话数据;启用session.use_trans_sid选项时需要先盗调用此方法;返回值为bool;
// $delete_old_session表示是否实处原会话存储文件;如果你需要避免会话并发访问冲突,那么不应该立即删除会话中的数据。如果你需要防止会话劫持攻击,那么可以立即删除会话数据。
session_regenerate_id($delete_old_session = false);
// 暂停session
// 结束当前会话并存储会话数据,会话数据通常在脚本终止后存储;返回值bool
// 但是由于会话数据被锁定以防止并发写入,因此任何时候任何会话都只能对一个脚本进行操作。将框架集与会话一起使用时,由于此锁定,您将体验到框架逐一加载的情况。完成对会话变量的所有更改后,您可以通过结束会话来减少加载所有帧所需的时间。
session_write_close();
// 删除session
// 释放当前会话注册的所有会话变量
session_unset();
// 删除一个会话中的全部数据,但是不会重置当前会话所关联的全局变量,也不会重置会话cookie。如果需要再次使用会话变量,必须重新调用session_start()函数。返回值bool
session_destroy();
设置Cookie
/* Cookie参数
lifetime Cookie的生命周期,以秒为单位
path Cookie的有效路径
domain Cookie的作用域,如果要让cookie在所有的子域中都可用,此参数必须以点(.)开头,例如:“.php.net”
secure 设置为true表示cookie仅在使用安全链接时可用
httponly 设置为true表示PHP发送cookie的时候会使用httponly标记。
*/
// 设置cookie参数,返回值false,$options为Cookie参数的数组
session_set_cookie_params($lifetime, $path, $domain, $secure = false, $httponly = false)
session_set_cookie_params($options):bool
// 获取cookie参数
list($lifetime, $path, $domain, $secure, $httponly) = session_get_cookie_params();
自定义会话管理器
如果需要在数据库中或者以其他方式存储会话数据, 需要使用session_set_save_handler()函数来创建一系列用户级存储函数。 可以使用SessionHandlerInterface类或者通过继承SessionHandler类来扩展内置的管理器,从而达到自定义会话保存机制的目的
方式1
// 在会话打开的时候会被调用,自动开始会话或者通过调用session_start()手动开始会话之后第一个被调用的回调函数。操作成功返回true,反之返回false。
function open(string $savePath, string $sessionName) {
}
// 如果会话中有数据,read回调函数必须返回将会话数据编码(序列化)后的字符串。如果会话中没有数据,read回调函数返回空字符串,
// 在自动开始会话或者通过调用session_start()函数手动开始会话之后,PHP内部调用read回调函数来获取会话数据。
function read(string $sessionId) {
};
// 在会话保存数据时会调用write回调函数。此回调函数接收当前会话ID以及$_SESSION中数据序列化之后的字符串作为参数。
// 序列化会话数据的过程由PHP根据session.serialize_handler设定值来完成。
function write(string $sessionId, string $data) {
};
// 在write回调函数调用之后调用,当调用session_write_close()函数之后,也会调用close回调函数。操作成功返回true,反之返回false。
function close() {
};
// 当调用session_destroy()、session_regenerate_id()函数并且设置destroy参数true时,会调用此回调函数。操作成功返回 true,反之返回 false。
function destroy(string $sessionId) {
};
// 为了清理会话中的旧数据,PHP会不时的调用垃圾收集回调函数。调用周期由session.gc_probability和session.gc_divisor参数控制。传入到此回调函数的lifetime参数由 session.gc_maxlifetime设置。 操作成功返回true,反之返回false。
function gc($lifetime) {
};
// 当需要新的会话ID时被调用的回调函数。回调函数被调用时无传入参数,其返回值应该是一个字符串格式的、有效的会话ID
function create_sid() {
};
// 当会话开始时执行此回调,提供会话ID并启用session.use_strict_mode。key是验证会话ID。如果具有该ID的会话已存在,则会话ID是有效的。返回值应该是true成功,false失败。
function validate_sid(string $key) {
};
// 当会话更新时执行此回调。key是会话ID,val是会话数据。返回值应该是true成功,false失败。
function update_timestamp(string $key, string $val) {
};
// 设置用户自定义会话存储函数,返回值为bool;'create_sid', 'validate_sid', 'update_timestamp'三个方法可以不设置
session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc', 'create_sid', 'validate_sid', 'update_timestamp');
方式2
// SessionIdInterface,SessionUpdateTimestampHandlerInterface连个接口也可以不继承
class Sessionhandler1 implements SessionHandlerInterface,SessionIdInterface,SessionUpdateTimestampHandlerInterface
{
}
$sessionhandler1 = new Sessionhandler1();
// 设置用户自定义会话存储函数,第二个参数为true表示将session_write_close()注册会话关闭函数;返回值为bool
session_set_save_handler($sessionhandler1, true):bool
SessionHandlerInterface类
一个接口,用于定义用于创建自定义会话处理程序的最小原型。为了使用其 OOP调用将自定义会话处理程序传递给session_set_save_handler(),该类可以实现此接口。
此类的回调方法旨在通过PHP在内部进行调用,而不是从用户空间代码中进行调用
//重新初始化现有的会话,或创建一个新的会话。在会话开始时或在 调用session_start()时调用。
SessionHandlerInterface::open(string $path , string $name):bool
//从会话存储中读取会话数据,并返回结果。在会话开始后或在调用session_start()时立即调用。请注意,在调用此方法之前,将调用SessionHandlerInterface::open()。会话启动时,PHP本身会调用此方法。此方法应通过提供的会话ID从存储中检索会话数据。此方法返回的字符串必须与最初传递给SessionHandlerInterface::write()时的序列化格式相同。 如果找不到该记录,则返回一个空字符串。
SessionHandlerInterface::read(string $id):string
//将会话数据写入会话存储。当session_register_shutdown()失败或正常关闭时,由session_write_close()调用 。注意:SessionHandlerInterface :: close()在此函数之后立即被调用。当会话准备好保存和关闭时,PHP将调用此方法。它将会话数据从$ _SESSION超全局变量编码为序列化的字符串,并将其与会话ID一起传递给此方法进行存储。在session.serialize_handler设置中指定了使用的序列化方法。
SessionHandlerInterface::write(string $id , string $data):bool
//关闭当前会话。该函数在关闭会话时自动执行,或通过session_write_close()显式执行
SessionHandlerInterface::close():bool
//销毁会话。当session_decode()失败时,由session_regenerate_id()(带有$destroy = true), session_destroy()调用。
SessionHandlerInterface::destroy(string $id):bool
//清理过期的会话。根据session.gc_divisor,session.gc_probability和session.gc_maxlifetime设置, 由session_start()调用
SessionHandlerInterface::gc(int $max_lifetime):int|bool