2

PHP 5.3__destructを使用してデータを書き込む際に、少し予期しない動作が発生することに気付きました。Zend_Session_Namespace

public function __destruct(){
    $this->getSession()->data = $this->data;
}
// ....
private function getSession()
{
    if (! self::$zendSession) {
        // this next line is fine because the object is a singleton
        self::$zendSession = new Zend_Session_Namespace(self::SESSION_NAMESPACE);
    }
    return(self::$zendSession);
}

デストラクタが呼び出されていますが、データは書き込まれていません。ただし、オブジェクトに対して必要なすべての操作が実行された後に暗黙的に destruct を呼び出し、スクリプトの終了前に破棄を強制すると、データは正常に書き込まれますが、これは行いたくありません。

このバグと関係があると思います: http://bugs.php.net/29032 (バグは私には少し古いようです)、一見したところ修正は良さそうです (シャットダウン関数として __destruct を登録します)。 、前に呼び出された$_SESSIONは使用できません)、しかし、デストラクタは 2 回呼び出されませんか (1register_shutdown_function回は自動的に呼び出されますか?

確かにシャットダウン時にオブジェクト データの奇数ビットをセッションに書き込むことは解決されていますか? これが必要な場合、人々は何をしますか?

(OSX 10.6.6、Apache 2.2.15 (Unix)、PHP 5.3.3、Zend Framework 1.7.2)

4

1 に答える 1

2

これは鶏が先か卵が先かという問題です。すべてのオブジェクトが破棄されるまでセッションの終了が残っていると、セッション保存ハンドラーにオブジェクトを使用できなくなります。

回避策は問題ありませregister_shutdown_functionん。コードが2回実行されないようにするには、セッション終了コードを、登録した別の関数に移動する必要があります。まだ存在しているオブジェクトに対して手動で__destruct()を呼び出すと、とにかく少し醜いようです;)

于 2011-02-24T10:03:34.587 に答える