4

我正在使用 PHP 5.4.12

我有两节课

<?php

class MySessionHandler implements SessionHandlerInterface {
//..
}

$handler = new MySessionHandler();
session_set_save_handler($handler,true);

?>

<?php
class MySession {
//..
function __destruct() {
     session_write_close();
     echo 'called';
    }
}

使用这段代码,MySession 的析构函数永远不会被调用。

<?php
require_once 'MySessionHandler.php';
include_once 'MySession.php';
$test = new MySession();

但是有了这段代码,“MySession”析构函数就可以调用了

<?php
require_once 'MySessionHandler.php';
include_once 'MySession.php';

class Test {
    function __construct() {
        $test = new MySession();
    }
}
$obj = new Test();

我已经测试了 session_set_save_handler($handler,true/false)。我需要调用 MySession 的析构函数,因为我对 session_write_close() 有疑问;我必须明确地调用它,否则会话永远不会被写入服务器。

有什么解决方法吗?我已将代码简化为它们的根源,但 __destruct 方法不应该在应该调用的时候调用。

4

2 回答 2

3

不要依赖__destruct...从手册中

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

于 2013-03-15T23:35:33.987 回答
1

在上述情况下,您需要实例化对象:

$test = new MySession();
于 2013-03-15T23:30:43.730 回答