2016-08-26 7 views
1

Я пытаюсь установить сеанс var в методе __destruct(). Метод __destruct() запущен, но session var не установлен. Пока сессия в __contruct() или другие методы (например, test()) работают как ожидалось.Почему я не могу установить сеанс var в методе __destruct()?

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

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

Обновленная версия. Теперь я попробую собственный компонент PHP Session и 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

Да, пример далек от завершения. Один вопрос, о котором я могу думать: как остановить сценарий? Лучшим был бы полный пример, мы можем работать. –

ответ

4

В сеансах Symfony используются пользовательские обработчики сеансов. (Через session_set_save_handler)

Пользовательские сессии обработчики вызвать PHP зарегистрировать функцию отключения (т.е. register_shutdown_function), вызывающую session_register_shutdown, который добавляет еще один обработчик завершения работы (так он будет выполнен последним), вызывая session_write_close, эффективно закрывая сеанс затем.

После того, как эта функция была вызвана, дальнейшие записи не будут сохранены. [поскольку обработчик сеанса больше не будет вызываться позже.]

И как деструкторы (объектов, которые еще не были очищены) запустите только после были выведены функции выключения, этот сеанс записи завершится с ошибкой.

Единственное решение, чтобы избежать этого, либо не использует пользовательский обработчик сеанса (не вариант для вас, я думаю), перезапуск сеанса вручную (до тех пор, пока порядок уничтожения не уничтожает первый класс) или явно уничтожает все ссылки на этот объект в обработчиках останова или раньше.

+0

Извините, но я не понимаю, что я должен сделать для решения моей проблемы. Вы можете мне помочь? – Stanislav

+0

Ну, вы не можете действительно _фиксировать это поведение. Вы должны обойти это. Либо просто не устанавливайте $ _SESSION в __destruct, либо убедитесь, что затронутые объекты уничтожены до последней функции выключения (например, с помощью явного unset() 'ing). То, что нужно сделать в вашем приложении, зависит от вашего кода. Вам придется это понять. – bwoebi

+0

Я действительно понимаю, что это поведение создает компонент сеанса Symfony? – Stanislav

 Смежные вопросы

  • Нет связанных вопросов^_^