在系统中使用 Session 技术追踪用户时,Session 默认的处理方式是 Web 服务器中的文件来记录每个用户的会话信息,通过 php.ini 中的 session.save_path 创建会话数据文件的路径。这种默认的处理方式虽然方便,但也是有缺陷的。会严重影响系统的执行效率。最主要的原因是本身的 Session 机制不能跨机,因为对于访问量比较大的系统,通常会采用多台服务器进行并发处理,如果每台服务器都单独的处理 Session,就无法达到跟踪用户的目的。这时就需要改变 Session的处理方式,可以将 Session 信息使用共享技术保存到其他服务器中,或是使用数据库来保存 Session 信息。
无论是用数据库,还是使用共享技术来共享 Session 信息,其中的原理基本是一样的,都是通过 PHP中 的 session_set_save_handler()函数来改变默认的处理方式,指定回调函数来自定义处理。该函数如下所示:
session_set_save_handler(open, close, read, write, destroy, gc)
该函数共需要6个回调函数作为必选参数,分别代表了 Session 生命周期中的 6 个过程,通过自定义每个函数,来设置
Session 生命周期中每个环节的信息处理。
回调函数 | 描 述 |
open | 运行 session_start()时执行。该含税需要声明两个参数,系统会自动将php.ini 中的 session.save_path 选项值传递给该函数的第一个参数,将session 名自动传递到第二个参数中。返回 true 则可以继续向下执行。 |
close | 该函数不需要参数,在脚本执行完成或调用 session_write_close()、session_destroy()时被执行,即在所有 Session 操作完成后被执行。如果不需要处理,直接返回 true。 |
read | 在运行 session_start()时执行,因为在开启会话时,会去读取当前 session 数据并写入 $_SESSION 变量。需要声明一个参数,系统会自动将 Session ID 传递给该函数,用于通过 Session ID获取对应的用户数据,返回当前用户的会话信息写入 $_SESSION 变量 |
write | 该函数在脚本结束和对$_SESSION 变量赋值时执行。需要声明两个参数,分别是 Session ID 和串行化后的 session 信息字符串。在对$_SESSION 变量赋值时,就可以通过 Session ID 找到存储的位置,并将信息写入。存储成功后返回 true 并继续向下执行 |
destroy | 在运行session_destroy()时执行,需要声明一个参数,系统会自动将 Session ID 传递给该函数,去删除对应的会话信息。 |
gc | 在垃圾回收程序启动时执行。需要声明一个参数,系统会将 php.ini 中的 session.gc_maxlifetime 选项值传给该函数,用于删除超过这个时间的 Session 信息。返回 true 则可以继续向下执行。 |
说明:在运行session_start()时分别执行了 open(启动会话)、read(读取当前 session 数据并写入 $_SESSION)和gc (清理垃圾)操作,脚本中所有对 $_SESSION 的操作均不会调用这些回调函数。在调用 session_destroy()函数时,执行destroy 销毁当前 session (一般是删除响应的记录或是文件),但此回调函数销毁的只是 session 的数据,此时如果输出
$_SESSION 变量,任然是有值的,但此值不会在 close 后被写回去。在调用 session_wrte_close()函数时执行 write 和 close, 保存 $_SESSION至存储,如果不手工使用,则会在脚本结束时被自动执行。
Atas ialah kandungan terperinci php自定义Session的信息处理说明. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!