使用 session_register_shutdown() 的目的是什么?
What is the purpose of using session_register_shutdown()?
我只是想知道什么时候以及为什么我们应该使用 session_register_shutdown()。
请不要从 php.net 复制描述。
谢谢
对于非面向对象的代码,关闭函数等同于 destructor。
如果某个组件不再需要并且你想采取行动,如果你想执行某些事情,你可以注册一个关闭函数,例如某种清理工作。
当会话被销毁时,会话关闭函数被调用,让您有机会在会话不再可用之前对会话执行最后的操作(例如,您可以从 $_SESSION
变量中提取参数).
通常情况下,您不需要使用此功能。
这是一个很好的问题,我很难在互联网上找到正确的答案。总之给了我一个很好的提示。
有两点需要考虑:
- 使用
register_shutdown_function
注册的自定义关闭函数 的调用顺序与注册的顺序相同 (参见 docs)。
session_set_save_handler
将session_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
总是最后调用,以便 func1
和 func2
可以访问会话数据。
这是 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()
。
我只是想知道什么时候以及为什么我们应该使用 session_register_shutdown()。 请不要从 php.net 复制描述。 谢谢
对于非面向对象的代码,关闭函数等同于 destructor。
如果某个组件不再需要并且你想采取行动,如果你想执行某些事情,你可以注册一个关闭函数,例如某种清理工作。
当会话被销毁时,会话关闭函数被调用,让您有机会在会话不再可用之前对会话执行最后的操作(例如,您可以从 $_SESSION
变量中提取参数).
通常情况下,您不需要使用此功能。
这是一个很好的问题,我很难在互联网上找到正确的答案。总之
有两点需要考虑:
- 使用
register_shutdown_function
注册的自定义关闭函数 的调用顺序与注册的顺序相同 (参见 docs)。 session_set_save_handler
将session_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
总是最后调用,以便 func1
和 func2
可以访问会话数据。
这是 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()
。