【问题标题】:PHP Destructor is not called未调用 PHP 析构函数
【发布时间】:2013-03-15 23:27:05
【问题描述】:

我正在使用 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 方法没有被调用。

【问题讨论】:

  • 见马歇尔回答。 MySession 是一个类而不是一个函数

标签: php


【解决方案1】:

不要依赖__destruct...From the manual:

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

【讨论】:

    【解决方案2】:

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

    $test = new MySession();
    

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 2017-04-28
      • 2013-07-07
      • 2013-09-19
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 2012-11-21
      • 2012-11-28
      相关资源
      最近更新 更多