2016-08-26 5 views
1

__destruct()メソッドでset session varを試してみます。 メソッド__destruct()は実行されていますが、セッション変数は設定されていません。 __contruct()や他のメソッド(test()など)のセッションは、期待通りに機能します。__destruct()メソッドでsession varを設定できないのはなぜですか?

public function test() 
{ 
    $_SESSION['MyVarTest'] = rand(200,300); ← working correctly 
} 

public function __destruct() 
{ 
    echo 'called'; 
    $_SESSION['MyVar'] = rand(1,100); ← not working 
} 

最新バージョン。今では、ネイティブのPHPセッションとSymfonyコンポーネントを試していますが、どちらも__destruct()メソッドでは動作しません。

<?php 

namespace Project\Modules\Cart\Storage; 

use Illuminate\Support\Collection; 

class Session 
{ 

    /** 
    * @var \Symfony\Component\HttpFoundation\Session\Session 
    */ 
    protected $session; 

    protected $cart; 

    public function __construct() 
    { 
     $this->cart = new Collection(); 

     $this->session = app('session'); 
     print_r($_SESSION); 

    } 

    public function test() 
    { 
     $this->session->set('json', rand(1,100)); ← working correctly 
     $_SESSION['json'] = rand(1,100); ← working correctly 
     return $this->cart->toJson(); 
    } 

    public function __destruct() 
    { 
     echo 'called'; 
     $_SESSION['MyVar'] = rand(1,100); ← not working 

     $this->session->set('cart', serialize($this->cart->toArray())); ← not working 
    } 

} 
+0

これをすべてテストする方法を教えてください。 –

+0

'__destruct()'が確実に呼び出されていることをどのように知っていますか? –

+0

はい、この例は完全ではありません。私が考えることができる1つの質問:どのようにスクリプトを停止しますか?最良の例は完全な例であり、私たちは実行することができます。 –

答えて

4

symfonyセッションでカスタムセッションハンドラが使用されています。 (session_set_save_handler経由)

カスタムセッションハンドラは、別のシャットダウンハンドラ(それが最後に実行されます)、効果的に、あなたのセッションを閉じて、session_write_closeを呼び出しを追加session_register_shutdownを、起動、シャットダウン機能(すなわちregister_shutdown_function)を登録するためにPHPを引き起こします。

この関数が呼び出された後、それ以上の書き込みは保存されません。

のデストラクタ(まだクリーンアップされていないオブジェクトの)は、の後にのみシャットダウン関数が呼び出されますが、このセッション書き込みは失敗します。

これを避ける唯一の解決策は、カスタムセッションハンドラ(私が推測するオプションではない)、手動でセッションを再開すること(破壊の順序がクラスを最初に破壊しない限り)、または明示的に破棄することですシャットダウンハンドラ内またはその前のこのオブジェクトへのすべての参照。

+0

申し訳ありませんが、私は理解していない、私の問題を解決するために何をすべきか。手伝って頂けますか? – Stanislav

+0

さて、あなたは本当にその動作を_fix_することはできません。あなたはそれを回避する必要があります。 __destructに$ _SESSIONを設定するのを避けるか、影響を受けるオブジェクトが最後のシャットダウン機能の前に破壊されていることを確認してください(明示的なunset()など)。アプリケーションで正確に実行する必要があるのは、コードによって異なります。あなたはそれを理解しなければなりません。 – bwoebi

+0

この動作によってSymfonyのSessionコンポーネントが作成されることを本当に理解していますか? – Stanislav

関連する問題