Laravel を使ってアプリケーションを開発し、元のコードをコピーします。 前回のコードセッションは、他のコンポーネントに依存していないため、移植後はうまく動作すると思いました。
未定義変数: _SESSION
Laravel のセッション設定ファイルは app/config/session.php で設定されており、使用する際はセッション設定ファイルで利用可能なオプション設定とコメントを確認できます。
Laravel はデフォルトでファイルを使用してセッションを実装します。彼女は PHP のネイティブ $_SESSION (php のネイティブ セッションは php.ini の場所に依存します) を使用しないため、session_start()、$_SESSION などの PHP 関連のセッション関数を無視します。プロセスの実行中、Laravel はセッション情報を app/storage/session/ ディレクトリに書き込むため、このディレクトリには書き込み権限が必要です。そうでない場合、セッションは正常に書き込まれません。
Laravel は、セッション実装としてデフォルト ファイルを使用することに加えて、Cookie、Memcached、Redis、およびデータベース バックエンド ドライバーもセッション実装としてサポートします。 WeChat パブリック アカウントとユーザー間の対話など、必要に応じてセッション実装を自分で実装する必要があります。これは、WeChat サーバーが毎回リクエストを作成し、ソースによってユーザーを識別できないため、セッションを直接使用することはできません。リクエストの。
Session の API は、中国語のドキュメントを見れば、おそらくそれが何を意味するかわかるでしょう。しかし、理解しにくい部分もいくつかあります。
//セッションの永続保存 (有効期限なしの範囲内)
Session::put('key', 'value');
//PHP のネイティブ セッションと同等
$_SESSION['key'] = 'value'
//get オペレーション
$ value = Session::get('key', 'default');
//ポップの概念と同様の削除操作と削除
$value = Session: : pull('key', 'default');
// キーが存在するかどうかを検出
Session::has('users'); 🎜 >
//キーの削除
Session::forget('key');
セッションが期限切れにならない限り、この対応は基本的に永続的に保存されます。次の http リクエストに使用されます。以下のフラッシュのコンセプトとは異なります。
laravel のセッションにおけるフラッシュの概念
//キー、値を保存
Session::flash('key', 'value');
//値のメソッドはまだ同じ 同じ
Session::get('key');
//フラッシュデータ時間を更新し、次のリクエストまで保持します
Session ::keep(array('username', 'email'));
フラッシュの概念は、上記の put の概念とは異なります。
put: セッションが期限切れにならない限り、この通信は基本的に永久に保存され、次のリクエストまで存在します。
flash: 保存された値は、このリクエストと次の http リクエストで使用できますが、次回には存在しません。
つまり、次のリクエストが使い果たされた後に破棄され、セッション値がどんどん大きくなることはなく、一部の一時データは保存されます。
この状況の使用シナリオは次のとおりです。
ユーザーがページをリクエストすると、エラー メッセージが表示され、ページは前のデータを表示する必要がある新しいページにリダイレクトされます。 (URL パラメーターを介して渡すことはできますが、適切に処理しないと XSS 脆弱性が存在する可能性があります)。
ユーザーがページにアクセスすると、フィルターは現在のページの URL を保存し、ログインが成功した場合はログイン ページにリダイレクトされました。元のページ。 (ここで保存されたフラッシュ データを更新する必要がある場合があります)
セッションのランディング時間
class LoginController {
public function login(){
Session::put('key', ' value');
print_r(Session::all()); // put が成功したかどうかを確認する
// 習慣的なデバッグは終了します。コードは実行されません
。次のリクエストでは現在のセッションが見つからず、app/storage/session ディレクトリにファイルは生成されません。何かがおかしいと感じます。その後、インターネット上にSession::save()というメソッドがあったのでそれを使ってみたところ、セッションファイルが正常に生成されていました。したがって、Laravel は PHP のネイティブセッションを使用しないので、すべての put 操作を書き込むのではなく、コントローラーの後に何らかの処理を行う必要があると感じました。これにより、IO 操作が頻繁になりすぎてパフォーマンスに影響します。
通話に関連するコードを表示します。 laravel がコンパイルされた後、bootstrap/compiled.php で
クラス ミドルウェア実装 HttpKernelInterface
{
...
public function handle(Request $request , $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
{
$this->checkRequestForArraySessions($request)
if ($this-> ; sessionconfigured ()) {
$ session = $ this- & gt; // セッションを開始します
$ request-sets; $ セッション);
} ->sessionConfigured()) {
$this->closeSession($session) // セッションを閉じる
$this-> ;addCookieToResponse($response, $session);
関数 closeSession (SessionInterface $ session)
{
$session->save(); // セッションを保存
$this->collectGarbage($session);
}
}
ヒント: 関数呼び出しがわからない場合は、コントローラーで new Exception(); をスローし、/config/app.php の debug を debug= >true に変更します。関数の呼び出し関係がわかります。
ご覧のとおり、コントローラーを呼び出した後、session->save() メソッドが呼び出され、セッションがアクティブに保存されます。このようにして、コントローラーまたはビューに exit; が記述されている場合、手動でセッションを保存するために Session::save() を積極的に記述しない限り、セッションは保存されません。したがって、デバッグ時には必ず注意してください。