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

时间:2015-08-24 11:01:45

标签: php session session-variables

我只是想知道我们应该使用session_register_shutdown()的时间和原因。 请不要从php.net复制说明。 感谢

2 个答案:

答案 0 :(得分:1)

对于非面向对象的代码,关闭函数相当于destructor

如果您想要在不再需要某个组件的情况下执行某些操作并且您想要采取措施(例如,某种清理。

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

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

答案 1 :(得分:0)

这是一个非常好的问题,我很难在互联网上找到正确的答案。无论如何this answer给了我一个很好的暗示。

有两点需要考虑:

  1. register_shutdown_function注册的自定义关闭功能按照与注册时相同的顺序进行调用(参见docs)。
  2. session_set_save_handlersession_register_shutdown注册为关闭函数,然后将session_write_close注册为关闭函数。
  3. 第二点非常重要,因为它确保session_write_close 始终会被称为最后,以便其他自定义关闭功能可以访问会话数据。

    实施例

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

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

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

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

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

    这是PHP开发人员的一个聪明伎俩:)

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

    更新

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

      

    当使用对象作为会话保存处理程序时,使用PHP注册shutdown函数非常重要,以避免PHP内部在关闭时内部销毁对象的方式产生意外的副作用,并可能阻止调用write和close。通常,您应该使用register_shutdown_function()函数

    注册'session_write_close'      

    从PHP 5.4.0开始,您可以使用session_register_shutdown()或在调用session_set_save_handler()时使用'register shutdown'标志

    因此,当会话处理程序是实现SessionHandlerInterface的类时,我上面所写的内容看起来是有效的。否则,需要从类构造函数中手动调用session_register_shutdown()

相关问题