最新のPHP開発では、Laravelは強力なセッション管理メカニズムを提供し、デフォルトでミドルウェアおよび構成ドライバーを使用して、ネイティブPHPのセッション動作をカプセル化します。ただし、いくつかの高度なシナリオでは、開発者はセッションのライフサイクルをより詳細に制御するために、 Session_register_shutdown()などのPHPのネイティブ機能を直接呼び出す必要がある場合があります。この記事では、Laravelにこの機能を統合し、その使用シナリオと考慮事項を調べる方法について説明します。
session_register_shutdown()は、スクリプト実行の最後に自動的に呼び出される関数を登録するPHPの関数です。通常、スクリプトが閉じたときにセッションデータが適切に保存されるようにするために使用されます。この機能は、カスタムセッションプロセッサでのクリーニングまたはデータの永続性操作に特に適しています。
Laravelは、SessionManagerクラスを使用して、すべてのセッションロジックを均一に管理します。基礎となるレイヤーは、ファイル、データベース、Redisなどなど、構成ファイルconfig/session.phpを介してセッションドライバーを選択します。RARAVELは、デフォルトでネイティブセッションライフサイクルメソッドを直接公開することはありませんが、カスタムセッションハンドラーインターフェイスの実装を介して基礎となるロジックにアクセスすることができます。
新しいプロセッサクラスを作成し、 SessionHandlerInterfaceインターフェイスを継承します。
namespace App\Extensions;
use SessionHandlerInterface;
class NativeSessionHandler implements SessionHandlerInterface
{
public function open($savePath, $sessionName)
{
return true;
}
public function close()
{
return true;
}
public function read($id)
{
// 読む session データ
return '';
}
public function write($id, $data)
{
// 書く session データ
file_put_contents('/tmp/sessions/' . $id, $data);
return true;
}
public function destroy($id)
{
@unlink('/tmp/sessions/' . $id);
return true;
}
public function gc($maxLifetime)
{
// ゴミコレクションを実行します
return true;
}
}
プロセッサを登録し、Laravelのサービスプロバイダーでネイティブ機能を使用できます。
// App\Providers\AppServiceProvider.php
use App\Extensions\NativeSessionHandler;
public function boot()
{
$handler = new NativeSessionHandler();
session_set_save_handler($handler, true);
// 登録が終了したときのセッション処理
session_register_shutdown();
// 手動スタート session(使用していない場合 Laravel ミドルウェア)
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
}
Laravelからのすべてのリクエストがこのカスタムセッションプロセッサを使用するようにしたい場合は、デフォルトのミドルウェアを無効にして構成を置き換えることができます。それ以外の場合、特定のリクエストのみがこのロジックを使用できます。
CLI環境または非同期スクリプトでの制御セッションの動作
Laravelシャットダウン中に緩衝出力やその他の問題によって引き起こされるセッションデータの損失を避けてください
http://m66.net/session-apiインターフェイスなど、システムのカスタム場所または外部サービスにセッションデータを保存します。
public function write($id, $data)
{
$url = 'http://m66.net/session-api/store';
file_get_contents($url . '?id=' . urlencode($id) . '&data=' . urlencode($data));
return true;
}
session_register_shutdown()を使用したコードは、Laravelのミドルウェアまたは応答キャッシングメカニズムによって干渉されるのを避けるために、リクエストライフサイクルの早期に実行する必要があります。
Laravelのセッションミドルウェア( Webミドルウェアグループなど)を使用する場合、ネイティブセッション制御ロジックとの競合を避ける必要があります。
問題の追跡を容易にするために、すべてのカスタムプロセッサのLaravelのロギングシステムにログと例外処理を含めることをお勧めします。
Laravelは高度なセッションカプセル化メカニズムを提供しますが、特定の要件の下で、PHP-Native Session_register_shutdown()を組み合わせることで、より多くの粒状制御機能をもたらす可能性があります。カスタムセッションハンドラーを使用すると、Laravelの柔軟性と基礎となるパフォーマンスチューニング要件を組み合わせて、複雑なシステムのより安定したセッション管理サポートを提供できます。