session_register_shutdown实际上做了什么?

时间:2015-04-22 23:43:46

标签: php

从官方php手册:

  

session_register_shutdown - 会话关闭功能

     

session_write_close()注册为关闭功能。

那么,会话关闭意味着什么? session_write_close与此之间的区别是什么?

为了说清楚,这个功能实际上做了什么?我们什么时候使用它?

似乎很少有人在网上使用和讨论这个功能。

3 个答案:

答案 0 :(得分:6)

这个功能实际上很少使用,互联网上几乎没有讨论,我终于从源代码评论中找到了答案:

/* This function is registered itself as a shutdown function by
 * session_set_save_handler($obj). The reason we now register another
 * shutdown function is in case the user registered their own shutdown
 * function after calling session_set_save_handler(), which expects
 * the session still to be available.

来自:https://github.com/php/php-src/blob/master/ext/session/session.c

显然,与官方手册相比,这清楚地说明了它究竟做了什么。

这个问题看起来很傻。

答案 1 :(得分:3)

这是一个公平的问题。我也对文档感到困惑。

在阅读十几次后我能够提取的是该功能只是代码的快捷版本

register_shutdown_function('session_write_close');

如果你调用die()或退出php脚本,会话将无法正常关闭(特别是如果你有一个自定义会话处理程序)。这个功能只不过是一个捷径。

我的特定会话处理程序的引导代码如下所示:

// Set the session handlers to the custom functions.
$handler = new SQLSrvSessionHandler();
session_set_save_handler(
  array($handler, 'sessionOpen'),
  array($handler, 'sessionClose'),
  array($handler, 'sessionRead'),
  array($handler, 'sessionWrite'),
  array($handler, 'sessionDestroy'),
  array($handler, 'sessionGC')
);
session_register_shutdown();

函数session_register_shutdown确保我的函数SQLSrvSessionHandler::sessionCloseSQLSrvSessionHandler::sessionWrite被调用,即使我运行骰子或退出语句。

我还发现this answer很有帮助。

答案 2 :(得分:0)

很少使用

在会话被销毁时将调用会话关闭功能,使您有机会在会话不再可用之前对会话执行最终操作(例如,可以从$ _SESSION变量中提取参数)。