2016-08-26 3 views
1

__destruct() 메서드에서 set session var를 시도합니다. 메서드 __destruct()가 실행 중이지만 세션 var가 설정되지 않았습니다. __contruct() 또는 다른 메소드 (예 : test())의 세션이 예상대로 작동하는 동안.__destruct() 메서드에서 세션 변수를 설정할 수없는 이유는 무엇입니까?

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

예, 예제는 아직 완료되지 않았습니다. 내가 생각할 수있는 한 가지 질문 : 스크립트를 어떻게 중단합니까? 최고는 완전한 예일 것이고, 우리는 달릴 수 있습니다. –

답변

4

Symfony 세션은 사용자 지정 세션 처리기를 사용하고 있습니다. 사용자 세션 핸들러는 PHP 효과적으로 다음 세션을 닫는, session_write_close를 호출, (그래서이 마지막으로 실행됩니다) 다른 종료 핸들러를 추가 session_register_shutdown를 호출하는 셧다운 기능 (즉 register_shutdown_function)를 등록하게

(session_set_save_handler를 통해).

해당 함수가 호출 된 후에는 더 이상의 쓰기가 저장되지 않습니다. [세션 처리기가 더 이상 호출되지 않으므로]

(아직 정리되지 않은 개체의) 소멸자가 후에 만 ​​실행되면이 세션 쓰기가 실패합니다.

이 문제를 피하는 유일한 해결책은 맞춤 세션 처리기 (내가 추측하는 옵션이 아님)를 사용하거나 수동으로 세션을 다시 시작하거나 (파괴 순서가 클래스를 먼저 파괴하지 않는 한) 또는 명시 적으로 삭제하는 것입니다 종료 핸들러에서 또는 이전에이 객체에 대한 모든 참조.

+0

미안하지만, 이해가 안됩니다. 제 문제를 해결하기 위해 무엇을해야합니다. 나 좀 도와 줄 수있어? – Stanislav

+0

글쎄, 그 행동을 정말로 고칠 수는 없다. 당신은 그 문제를 해결해야합니다. __destruct에 $ _SESSION을 설정하지 않거나 영향을받는 객체가 마지막 종료 기능 (예 : 명시 적 unset()) 이전에 삭제되는지 확인하십시오. 애플리케이션에서 정확히 수행해야하는 작업은 코드에 따라 다릅니다. 너 자신을 알아 내야 할거야. – bwoebi

+0

이 동작으로 Symfony의 Session 구성 요소가 생성된다는 것을 알고 있습니까? – Stanislav

관련 문제