이전 버전의 PHP에서 Session_Register_Shutdown ()은 스크립트 끝에서 세션 데이터를 올바르게 저장할 수 있도록 중요한 기능이었습니다. 주요 기능은 스크립트 수명주기가 끝날 때 SESSION_WRITE_CLOSE ()를 자동으로 호출하여 $ _SESSION에서 서버 측 세션 스토리지로 다시 데이터를 작성하는 것입니다.
그러나 Symfony와 같은 최신 프레임 워크를 사용할 때이 저수준 세션 작업이 필요합니까? 이 기사는 Symfony의 건축 및 PHP 언어 개발과 함께이 문제에 대해 논의하고보다 우아한 대안을 제안합니다.
전통적인 PHP 응용 프로그램에서는 종종 다음과 같은 사용법을 만납니다.
session_start();
session_register_shutdown();
// 설정 session 데이터
$_SESSION['user'] = 'Alice';
이것의 목적은 스크립트 실행 끝에 세션 상태를 자동으로 저장하여 경우에 따라 데이터가 작성되는 것을 방지하는 것입니다 (예 : 스크립트가 비정상적으로 종료되거나 Session_Write_Close ()을 호출하는 것을 잊어 버립니다). 그러나이 접근법은 애플리케이션 계층 코드와의 과도한 커플 링 및 글로벌 상태에 대한 과도한 의존성과 같은 일부 설계 문제를 노출시킵니다.
Symfony는보다 현대적이고 추상적 인 세션 관리 메커니즘을 채택합니다. 기본적으로 SessionInterface를 사용하여 세션에 대한 액세스를 제공하고 이벤트 리스너 및 서비스 컨테이너를 통해 세션의 수명주기를 자동으로 관리합니다.
일반적인 Symfony 컨트롤러에서 세션 사용은 다음과 같습니다.
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
public function example(Request $request, SessionInterface $session)
{
$session->set('user', 'Alice');
return $this->render('example.html.twig');
}
Symfony는 요청이 처리 된 후 개발자의 수동 개입없이 자동으로 Session_Write_Close () 를 호출합니다. 이는 Symfony에서 Session_Register_Shutdown ()을 사용하는 것이 불필요 할뿐만 아니라 프레임 워크 자체의 세션 라이프 사이클 관리를 중단한다는 것을 의미합니다.
Symfony에서는 프레임 워크가 세션의 초기화 및 폐쇄를 자동으로 처리하도록 완전히 신뢰할 수 있습니다. 더 권장되는 관행에는 다음이 포함됩니다.
종속성 주입 세션 인터페이스 : 의존성 주입을 통한 세션을 사용하면 수명주기에서 올바른 초기화 및 청소를 보장 할 수 있습니다.
세션 서비스를 통한 구성 및 스토리지 관리 : Symfony의 세션 핸들러를 구성하면 데이터베이스, Redis 또는 사용자 정의 스토리지에 세션을 저장하여 성능 및 보안을 향상시킬 수 있습니다.
이벤트 리스너와 함께 확장 : 세션이 작성되기 전에 일부 논리를 실행 해야하는 경우 kernel.terminate 또는 kernel.response 이벤트에 이벤트 리스너를 등록 할 수 있습니다.
예를 들어, 사용자 정의 세션 핸들러는 framework.yaml 에서 구성 할 수 있습니다.