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は、より近代的で抽象的なセッション管理メカニズムを採用しています。デフォルトでは、セッションインターフェイスを使用してセッションへのアクセスを提供し、イベントリスナーとサービスコンテナを通じてセッションのライフサイクルを自動的に管理します。
典型的な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は、開発者による手動介入を必要とせずに、リクエストが処理された後、 Cession_write_close()を自動的に呼び出します。これは、Symfonyでsession_register_shutdown()を使用することは不要であるだけでなく、フレームワーク自体のセッションライフサイクルの管理を破ることも意味します。
Symfonyでは、このフレームワークは、セッションの初期化と閉鎖を自動的に処理するために完全に信頼できます。より推奨されるプラクティスは次のとおりです。
依存関係噴射セッションインターフェイス:依存関係噴射を介してセッションを使用すると、ライフサイクルでの正しい初期化とクリーニングを確保できます。
セッションサービスで構成とストレージを管理する:Symfonyのセッションハンドラーを構成することにより、セッションをデータベース、Redis、またはカスタムストレージに保存して、パフォーマンスとセキュリティを改善できます。
イベントリスナーで拡張する:セッションを書き込む前にロジックを実際に実行する必要がある場合は、イベントリスナーをkernel.terminateまたはkernel.responseイベントに登録できます。
たとえば、カスタムセッションハンドラーは、 framework.yamlで構成できます。