파괴 기능의 기능은 기존 세션을 삭제하는 것입니다. 사용자가 로그 아웃하거나 세션이 만료되면 모든 세션 관련 데이터를 정리하기 위해 파괴가 호출됩니다.
SessionHandler 인터페이스는 파괴 방법을 구현해야합니다. 이 메소드는 매개 변수, 즉 세션 ID ( $ session_id )를 수용하며 해당 세션 데이터를 식별하고 파괴하는 데 사용됩니다.
먼저 사용자 정의 세션 처리 클래스를 만들고 SessionHandler 인터페이스에서 다양한 메소드를 구현해야합니다. 간단한 프레임 워크는 다음과 같습니다.
<span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">MySessionHandler</span></span><span> </span><span><span class="hljs-keyword">implements</span></span><span> </span><span><span class="hljs-title">SessionHandlerInterface</span></span><span>
{
</span><span><span class="hljs-keyword">private</span></span><span> </span><span><span class="hljs-variable">$save_path</span></span><span>;
</span><span><span class="hljs-comment">// 초기화 방법,저장 경로 등을 설정하는 데 사용됩니다.</span></span><span>
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">open</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$save_path</span></span></span><span>, </span><span><span class="hljs-variable">$session_name</span></span><span>)
{
</span><span><span class="hljs-variable language_">$this</span></span><span>->save_path = </span><span><span class="hljs-variable">$save_path</span></span><span>;
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
}
</span><span><span class="hljs-comment">// 세션을 닫으십시오</span></span><span>
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">close</span></span><span>(</span><span><span class="hljs-params"></span></span><span>)
{
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
}
</span><span><span class="hljs-comment">// 세션 데이터를 읽습니다</span></span><span>
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">read</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$session_id</span></span></span><span>)
{
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>->save_path . DIRECTORY_SEPARATOR . </span><span><span class="hljs-variable">$session_id</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">file_exists</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-string">''</span></span><span>;
}
</span><span><span class="hljs-comment">// 세션 데이터를 작성하십시오</span></span><span>
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">write</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$session_id</span></span></span><span>, </span><span><span class="hljs-variable">$session_data</span></span><span>)
{
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>->save_path . DIRECTORY_SEPARATOR . </span><span><span class="hljs-variable">$session_id</span></span><span>;
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">file_put_contents</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-variable">$session_data</span></span><span>) === </span><span><span class="hljs-literal">false</span></span><span> ? </span><span><span class="hljs-literal">false</span></span><span> : </span><span><span class="hljs-literal">true</span></span><span>;
}
</span><span><span class="hljs-comment">// 세션 데이터를 파괴하십시오</span></span><span>
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">destroy</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$session_id</span></span></span><span>)
{
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>->save_path . DIRECTORY_SEPARATOR . </span><span><span class="hljs-variable">$session_id</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">file_exists</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) {
</span><span><span class="hljs-title function_ invoke__">unlink</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
}
</span><span><span class="hljs-comment">// 쓰레기 재활용 메커니즘</span></span><span>
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">gc</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$max_lifetime</span></span></span><span>)
{
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-title function_ invoke__">glob</span></span><span>(</span><span><span class="hljs-variable">$this</span></span><span>->save_path . DIRECTORY_SEPARATOR . </span><span><span class="hljs-string">'*'</span></span><span>) </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">filemtime</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>) + </span><span><span class="hljs-variable">$max_lifetime</span></span><span> < </span><span><span class="hljs-title function_ invoke__">time</span></span><span>()) {
</span><span><span class="hljs-title function_ invoke__">unlink</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
}
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
}
}
</span></span>
위의 코드에서 파괴 함수의 기능은 지정된 세션 ID로 세션 파일을 삭제하는 것입니다. 사용자가 로그 아웃을 요청하거나 세션이 만료되면 파괴 기능이 트리거되고 파일이 삭제되어 세션 데이터를 정리합니다.
<span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">destroy</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$session_id</span></span></span><span>)
{
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>->save_path . DIRECTORY_SEPARATOR . </span><span><span class="hljs-variable">$session_id</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">file_exists</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) {
</span><span><span class="hljs-title function_ invoke__">unlink</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
}
</span></span>
수신 세션 ID :이 함수는 세션 ID ( $ session_id )를 수신합니다.이 기능은 삭제 해야하는 세션 데이터의 고유 식별자입니다.
파일이 존재하는지 확인하십시오 . 먼저 함수는 해당 세션 파일이 존재하는지 확인합니다. 파일이 존재하지 않으면 true를 직접 반환하여 삭제해야 할 파일이 없음을 나타냅니다.
파일 삭제 : 파일이 존재하는 경우 unlink () 함수를 사용하여 파일을 삭제하십시오. Unlink () 는 PHP에서 파일을 삭제하는 데 사용되는 내장 기능입니다.
반환 값 : 함수는 TRUE를 반환하여 파괴 과정이 성공적으로 완료되었음을 나타냅니다.
실제로 사용하면 파일 삭제 작업의 보안을 보장하기 위해 오류 처리 메커니즘을 추가해야 할 수도 있습니다. 예를 들어 로그 레코드를 추가하여 삭제 작업의 성공 및 실패를 추적하거나 Unlink () 작업의 실패를 추가로 처리 할 수 있습니다.
<span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">destroy</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$session_id</span></span></span><span>)
{
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>->save_path . DIRECTORY_SEPARATOR . </span><span><span class="hljs-variable">$session_id</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">file_exists</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) {
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">unlink</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) {
</span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"Failed to delete session file: <span class="hljs-subst">$file</span></span></span><span>");
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">false</span></span><span>; </span><span><span class="hljs-comment">// 삭제가 실패한 경우,반품 false</span></span><span>
}
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
}
</span></span>
PHP가 사용자 정의 세션 처리 클래스를 사용하려면 Session_SET_SAVE_HANDLER () 함수를 통해 사용자 정의 세션 프로세서를 등록해야합니다.
<span><span><span class="hljs-variable">$handler</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">MySessionHandler</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">session_set_save_handler</span></span><span>(
[</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'open'</span></span><span>],
[</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'close'</span></span><span>],
[</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'read'</span></span><span>],
[</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'write'</span></span><span>],
[</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'destroy'</span></span><span>],
[</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'gc'</span></span><span>]
);
</span><span><span class="hljs-comment">// 세션을 시작하십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">session_start</span></span><span>();
</span></span>
사용자 정의 세션 처리 클래스를 완료 한 후 테스트를 수행 할 수 있습니다. 세션의 파괴 과정을 트리거하여 예상대로 Destrove 기능이 작동하는지 확인하십시오 (예 : Session_Destroy () ). 세션 데이터가 올바르게 삭제되었는지 확인하고 잔여 세션 파일이 없습니다.
SessionHandler :: Destroy 기능을 구현하는 것은 사용자 정의 세션 처리 클래스에서 중요한 단계로 세션이 끝날 때 리소스를 정리하는 데 도움이됩니다. 합리적인 파일 작업 및 오류 처리를 통해 세션 데이터를 완전히 파괴하여 응용 프로그램 보안 및 성능을 향상시킬 수 있습니다.