PHP에서 SessionHandler는 세션 데이터가 저장, 읽기, 업데이트 및 파괴되는 방법을 정의하는 추상 클래스입니다. SessionHandler :: Close 는 PHP 세션이 종료 될 때 자동으로 호출되는 수명주기 방법으로 종료 작업이 수행되고 리소스가 제출됩니다. 기본적으로 Close는 세션 파일을 닫는 동안 세션 데이터의 쓰기 및 저장을 처리합니다.
그러나 개발자가 세션 스토리지 메커니즘을 사용자 정의 할 때 SessionHandler :: Close 의 동작이 영향을받을 수 있으므로 데이터가 제대로 저장되지 않거나 데이터 손실이 발생하지 않습니다.
session_write_close ()는 너무 일찍 호출됩니다
Code에서 Session_Write_Close ()가 호출되면 스토리지 미디어 (예 : 파일, 데이터베이스 등)에 세션 데이터를 작성하는 것을 포함하여 현재 세션의 작동을 강요합니다. 현재 SessionHandler :: Close 메소드가 미리 트리거되어 데이터가 올바르게 작성되지 않습니다.
예를 들어, 데이터 저장소 또는 수정 작업을 실행 한 직후 Session_Write_Close ()를 호출하면 다른 작업이 완료되기를 기다리지 않고 데이터의 지속성 프로세스가 중단되어 일부 또는 모든 세션 데이터가 손실 될 수 있습니다.
부적절한 사용자 정의 세션 저장 메커니즘
사용자 정의 세션 핸들러 클래스를 구현할 때, 특히 데이터가 저장되고 읽을 때, 가까운 메소드가 제대로 구현되지 않으면 세션 데이터가 완전히 작성되지 않을 수 있습니다. 예를 들어, 닫기 메소드는 쓰기 작업을 올바르게 호출하지 않거나 실행 중에 오류가 발생하여 데이터가 저장되지 않도록합니다.
데이터베이스 스토리지 메커니즘을 사용자 정의하고 가까운 방법으로 데이터베이스 연결을 커밋하거나 정리하는 것을 잊어 버리면 데이터가 데이터베이스에 저장되지 않을 수 있습니다.
Session_SAVE_PATH 설정 오류
Session_Save_Path 는 Session Data Storage의 위치를 지정하기 위해 PHP가 사용하는 구성 항목입니다. 경로가 올바르게 설정되지 않았거나 PHP가 디렉토리에 쓸 수있는 충분한 권한이 없으면 SessionHandler :: Writ
이 경우 닫기 메소드는 쓰기 작업을 올바르게 완료하지 못할 수 있으며 오류가 없더라도 데이터가 여전히 손실됩니다.
SessionHandler :: Close를 호출 한 후 세션 데이터를 수정하십시오
SessionHandler :: Close를 호출 한 후 세션 데이터를 계속 수정하면 이러한 수정은 저장되지 않습니다. Close 메소드를 호출 한 후 세션이 End로 표시되었으므로 세션 데이터에 대한 추가 작업은 무시됩니다.
세션 _write_close ()를 올바르게 호출하십시오
스크립트 초반에 세션을 실제로 종료 해야하는 경우 마지막 작업이 완료된 후 Session_Write_Close ()를 호출 할 수 있습니다. 모든 데이터가 저장되기 전에이 방법을 호출하지 마십시오. 일반적으로 Session_Write_Close ()는 스크립트 실행 종료시 배치되어 세션을 마치기 전에 모든 작업이 완료되도록합니다.
사용자 정의 세션 스토리지를 신중하게 구현하십시오
SessionHandler를 사용자 정의 할 때는 가까운 방법의 모든 데이터 쓰기 작업이 올바르게 실행되는지 확인하십시오. 파일 스토리지의 경우 file_put_contents 또는 플록 메소드를 사용하여 파일 쓰기가 완료되도록 할 수 있습니다. 데이터베이스 스토리지의 경우 세션이 끝나기 전에 커밋 작업이 완료되도록해야합니다.
샘플 코드 :
<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">extends</span></span><span> </span><span><span class="hljs-title">SessionHandler</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-comment">// 쓰기 작업을 확인하십시오</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable language_">$this</span></span><span>-></span><span><span class="hljs-title function_ invoke__">saveDataToStorage</span></span><span>()) {
</span><span><span class="hljs-built_in">parent</span></span><span>::</span><span><span class="hljs-title function_ invoke__">close</span></span><span>(); </span><span><span class="hljs-comment">// 부모 수업을 호출합니다 close 방법</span></span><span>
}
}
</span><span><span class="hljs-keyword">private</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">saveDataToStorage</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-comment">// 맞춤형 스토리지 작업</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>
session_save_path 구성을 확인하십시오
Session_Save_Path 가 올바르게 구성되고 PHP 프로세스에 디렉토리에 쓸 수있는 권한이 있는지 확인하십시오. 사용자 정의 저장소 방법 (예 : 데이터베이스 스토리지)을 사용하는 경우 관련 연결 및 권한이 올바르게 구성되어 있는지 확인하십시오.
세션 저장 경로는 다음 코드로 확인할 수 있습니다.
<span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">session_save_path</span></span><span>(); </span><span><span class="hljs-comment">// 전류를 인쇄하십시오 session 저장 경로</span></span><span>
</span></span>
닫은 후 세션 데이터를 수정하지 마십시오
SessionHandler :: close 또는 session_write_close ()가 호출되면 세션 데이터를 수정하지 마십시오. 세션이 모든 작업을 처리 한 후 세션을 마감하는 것이 가장 좋습니다.
예:
<span><span><span class="hljs-title function_ invoke__">session_start</span></span><span>();
</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'username'</span></span><span>] = </span><span><span class="hljs-string">'example'</span></span><span>;
</span><span><span class="hljs-comment">// 여기서 전화하지 마십시오 session_write_close</span></span><span>
</span><span><span class="hljs-title function_ invoke__">session_write_close</span></span><span>(); </span><span><span class="hljs-comment">// 모든 작업 후에 전화하십시오</span></span><span>
</span></span>