PHPでセッションを処理するとき、 sessionhandler :: close()とsession_write_close()の2つの一見関連する関数に遭遇することがよくあります。名前は似ており、関数はセッションのシャットダウンに関連していますが、その目的、使用のタイミング、および基礎となるメカニズムはさまざまです。この記事では、実際の状況に応じて最も適切な方法を選択するのに役立つこれら2つの機能の違いを詳細に調べます。
session_write_close()は、現在のセッションの書き込み操作を手動で終了するグローバル関数です。デフォルトでは、PHPはスクリプト実行の終了時にセッションを自動的に閉じますが、特定のシナリオ(マルチスレッドの使用やロックの早期リリースの必要性など)では、明示的に呼び出す必要がある場合があります。
この関数の関数は次のとおりです。
セッションデータを書き込み、保存します。
セッションファイルのロックをリリースし、他のリクエストがユーザーのセッションにアクセスできるようにします。
呼び出されると、現在のスクリプトは$ _Sessionを使用して新しいデータを書き込むことができなくなり、読み取りはまだ利用可能です。
sessionhandler :: close()は、 PHPのセッションハンドラークラスのメソッドです。開発者による直接の呼び出しには使用されませんが、セッションライフサイクルの終わりにPHP内部メカニズムによって呼び出されます。
カスタムセッションプロセッサ( SessionHandlerInterfaceまたはSessionHandlerクラスの継承など)を使用する場合、データベース接続の閉鎖やログへの書き込みなど、セッションが閉じたときに何をすべきかを定義するためにこのメソッドを実装する必要があります。
これは、session_set_save_handler()登録の一部であり、セッションライフサイクルの処理フローを定義するために使用されます。
| 特性 | session_write_close() | sessionhandler :: close() |
|---|---|---|
| タイプ | グローバル機能 | クラスメソッド |
| 開発者から呼ばれているかどうか | はい | いいえ(PHPによって内部的に呼ばれます) |
| 主な関数 | セッションデータを保存し、ロックをリリースします | カスタムセッションの閉じる動作を定義します |
| カスタムセッションプロセッサに適していますか? | いいえ | はい |
| シナリオを使用します | 事前にセッションロックをリリースします | セッションライフサイクル管理を実装します |
session_write_close()を使用したシナリオ:
<span><span><span class="hljs-title function_ invoke__">session_start</span></span><span>();
</span><span><span class="hljs-comment">// いくつか設定します Session データ</span></span><span>
</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'user_id'</span></span><span>] = </span><span><span class="hljs-number">123</span></span><span>;
</span><span><span class="hljs-comment">// 事前にロックをリリースします</span></span><span>
</span><span><span class="hljs-title function_ invoke__">session_write_close</span></span><span>();
</span><span><span class="hljs-comment">// その他は将来実行される可能性があります。 Session 論理,同時リクエストまたは出力の場合</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Session closed early."</span></span><span>;
</span></span>カスタムセッションハンドラーを使用:: close() :
<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-title">bool</span></span><span> {
</span><span><span class="hljs-comment">// カスタムロジック,例如关闭データ库连接</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-built_in">parent</span></span><span>::</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
}
}
</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-literal">true</span></span><span>);
</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">'foo'</span></span><span>] = </span><span><span class="hljs-string">'bar'</span></span><span>;
</span></span>この例では、 Close()は、セッションライフサイクルの終了時にPHPによって自動的に呼び出されます。
アプリケーションシナリオに依存します。
デフォルトのセッションメカニズムを使用しており、他のリクエストが実行を継続できるようにセッションロックを事前にロジックにリリースする必要がある場合は、 session_write_close()を使用する必要があります。
カスタムセッションストレージメカニズム(Redis、データベース、暗号化されたストレージなど)を実装しており、セッションライフサイクルの各段階の動作を制御する必要がある場合は、 SessionHandler :: Close()を実装する必要があります。
1つの文をまとめるには:
session_write_close()は、動作の制御に適しています。 sessionhandler :: close()は、動作を定義するのに適しています。
両方の機能はセッションの「閉鎖」に関連していますが、それらの責任と使用法は非常に異なります。それらの違いを理解することで、より安定したパフォーマンスのPHPアプリケーションを書くことができます。毎日の開発では、 session_write_close()の合理的な使用は、セッションロックによって引き起こされるパフォーマンスボトルネックを効果的に回避できます。 Mastering SessionHandler :: Close()は、高度なセッション管理メカニズムを構築するための基礎です。