使用 session_register_shutdown() 的目的是什么?

What is the purpose of using session_register_shutdown()?

我只是想知道什么时候以及为什么我们应该使用 session_register_shutdown()。 请不要从 php.net 复制描述。 谢谢

对于非面向对象的代码,关闭函数等同于 destructor

如果某个组件不再需要并且你想采取行动,如果你想执行某些事情,你可以注册一个关闭函数,例如某种清理工作。

当会话被销毁时,会话关闭函数被调用,让您有机会在会话不再可用之前对会话执行最后的操作(例如,您可以从 $_SESSION 变量中提取参数).

通常情况下,您不需要使用此功能。

这是一个很好的问题,我很难在互联网上找到正确的答案。总之给了我一个很好的提示。

有两点需要考虑:

  1. 使用 register_shutdown_function 注册的自定义关闭函数 的调用顺序与注册的顺序相同 (参见 docs)。
  2. session_set_save_handlersession_register_shutdown注册为关闭函数,进而将session_write_close注册为关闭函数。

第 2 点非常重要,因为它确保 session_write_close 始终最后调用 ,以便其他自定义关闭函数可以访问会话数据。

示例:

考虑我们注册两个关闭函数和一个自定义会话处理程序的情况:

register_shutdown_function(func1);// registers `func1`
session_set_save_handler(...);// registers `session_register_shutdown`
register_shutdown_function(func2);// registers `func2`

在此示例中,将在关机时调用以下函数:

func1();
session_register_shutdown();// registers `session_write_close`
func2();
session_write_close();

因此无论以何种顺序注册关闭函数和自定义会话处理程序,session_write_close 总是最后调用,以便 func1func2 可以访问会话数据。

这是 PHP 开发人员的聪明技巧 :)

我们需要调用自己这个函数的唯一情况是,如果我们有一个关闭函数,它本身注册了另一个需要访问会话数据的函数……我想这不太可能。

更新

我错过了 session_set_save_handler 文档中的重要信息:

When using objects as session save handlers, it is important to register the shutdown function with PHP to avoid unexpected side-effects from the way PHP internally destroys objects on shutdown and may prevent the write and close from being called. Typically you should register 'session_write_close' using the register_shutdown_function() function

As of PHP 5.4.0 you can use session_register_shutdown() or simply use the 'register shutdown' flag when invoking session_set_save_handler()

所以当会话处理程序是 class 实现 SessionHandlerInterface 时,我上面写的似乎是有效的。否则需要从 class 构造函数中手动调用 session_register_shutdown()