4

PHP 5.4.12 を使用しています

私は2つのクラスを持っています

<?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」デストラクタはokと呼ばれています

<?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) をテストしました。session_write_close() に問題があるため、MySession のデストラクタを呼び出す必要があります。明示的に呼び出す必要があります。そうしないと、セッションがサーバーに書き込まれません。

これに関する回避策はありますか?コードを根元まで単純化しましたが、__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 に答える