破壊関数の関数は、既存のセッションを削除することです。ユーザーがログアウトするか、セッションの有効期限が切れると、破壊が呼び出され、すべてのセッション関連データをクリーンアップします。
SessionHandlerインターフェイスでは、 Destroyメソッドを実装する必要があります。この方法は、パラメーター、つまりセッション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を返し、削除する必要があるファイルがないことを示します。
ファイルの削除:ファイルが存在する場合、 lonink()関数を使用してファイルを削除します。 Unlink()は、ファイルを削除するためにPHPが使用する組み込み関数です。
戻り値:関数は真で戻り、破壊プロセスが正常に完了したことを示します。
実際の使用では、ファイル削除操作のセキュリティを確保するために、エラー処理メカニズムを追加する必要がある場合があります。たとえば、ログレコードを追加して、削除操作の成功と失敗を追跡したり、 link()操作の故障を処理したりできます。
<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>
カスタムセッション処理クラスを完了したら、テストを実行できます。セッションの破壊プロセスをトリガーすることにより、破壊関数が予想どおりに機能するかどうかを確認します(たとえば: session_destroy() )。セッションデータが正しく削除されているかどうかを確認し、残留セッションファイルはありません。
SessionHandler :: Destroy Functionの実装は、セッションの最後にリソースをクリーンアップするのに役立つカスタムセッション処理クラスの重要なステップです。合理的なファイル操作とエラー処理により、セッションデータの完全な破壊を確保し、アプリケーションのセキュリティとパフォーマンスを改善できます。