ホームページ >PHPフレームワーク >Laravel >Laravelのセッション有効期限について詳しく解説

Laravelのセッション有効期限について詳しく解説

藏色散人
藏色散人転載
2020-07-11 16:10:316892ブラウズ

Laravel の次のチュートリアル コラムでは、laravel でのセッションの有効期限について紹介します。

Laravelのセッション有効期限について詳しく解説

プロジェクト開発のプロセスでは、フロントエンドとバックエンドの分離でセッションを使用してユーザーのログイン情報を保存する必要があります。

これには、セッションの有効期間

セッションはphpでのセッション有効期間とlaravelでのセッション有効期間に分かれています

デフォルトの有効期間は

phpでsession.gc_maxlifetimeを参照してください。 ini

デフォルトは 1440 秒で、これはほぼ 24 分です

そして、laravel のセッション有効期間は config/session.php

'lifetime' => 120,

'expire_on_close' => false,
# にあります##If 'expire_on_close' is set to If false, 'lifetime' is valid. If 'expire_on_close' is set to true, 'lifetime' is valid.

laravel のセッションの具体的な使い方について

学習ソース: https://www.chenyudong .com/archives/laravel-session-use.html

公式文書アドレス: http://laravelacademy.org/post/7954.html

Laravel を使用してアプリケーションを開発し、元のコードをコピーします。前のコード セッションは

$_SESSION

を使用していました。他のコンポーネントに依存していないため、移植してもうまく動作すると思いました。結果、この 未定義変数が表示されました: _SESSION

Laravel のセッション設定ファイルは
app/config/session.php

に設定されています。セッション構成ファイルで利用可能なオプション設定とコメントで。 Laravel はデフォルトで

file

を使用してセッションを実装します。彼女は PHP のネイティブ $_SESSION (php のネイティブ セッションは php.ini の場所に依存します) を使用しないため、session_start()$_SESSION## などの PHP 関連のセッション関数を無視します。 #。プロセスの実行中、Laravel はセッション情報を app/storage/session/ ディレクトリに書き込むため、このディレクトリには書き込み権限が必要です。そうでない場合、セッションは正常に書き込まれません。 デフォルトのファイルをセッション実装として使用することに加えて、Laravel は cookie

MemcachedRedisdatabase# もサポートしています。 ## バックエンド ドライバーはセッションの実装として機能します。 WeChat パブリック アカウントとユーザー間のやり取りなど、必要に応じてセッション実装を自分で実装する必要がありますが、WeChat サーバーが毎回リクエストを作成し、ソースによってユーザーを識別できないため、セッションを直接使用することはできませんリクエストの。 Laravel のセッション概要 API

Session の API は比較的単純なので、中国語のドキュメントを見れば意味がわかると思います。しかし、理解しにくい部分もいくつかあります。
//session的永久保存(在不过期范围内)
Session::put('key', 'value');

//等同于PHP的原生session
$_SESSION['key'] = 'value';

//get操作
$value = Session::get('key', 'default');

//去除操作并删除,类似pop概念
$value = Session::pull('key', 'default');

//检测是否存在key
Session::has('users');

//删除key
Session::forget('key');
セッションが期限切れにならない限り、この通信は基本的に永続的に保存され、次の http リクエストまで存在します。以下のフラッシュのコンセプトとは異なります。

laravel のセッションにおけるフラッシュの概念

しかし、Laravel は フラッシュ flash という概念を思いつき、突然私を混乱させました。このフラッシュは、リクエストの実行回数に関係なく、2 回のリクエスト (今回と次のリクエストが有効) まで有効です。

//保存key,value
Session::flash('key', 'value');

//取值方法还是一样的
Session::get('key');

//刷新快闪数据时间,保持到下次请求
Session::keep(array('username', 'email'));

この flash の概念は、上記の

put

の概念とは異なります。 put: セッションが期限切れにならない限り、この通信は基本的に永続的に保存され、次のリクエストまで存在します。

フラッシュ: 保存された値は、このリクエストと次の http リクエストで使用できますが、次回には存在しません。
  • つまり、次のリクエストは使い果たされたら破棄されますが、セッション値がどんどん大きくなることはなく、一時的なデータはある程度保存されます。
  • この状況の使用シナリオは次のとおりです:

ユーザーがページをリクエストすると、エラー メッセージが表示され、ページは前のデータを表示する必要がある新しいページにリダイレクトされます。 。 (URL パラメーターを介して渡すことはできますが、適切に処理しないと XSS 脆弱性が存在する可能性があります)。

ユーザーがページにアクセスしましたが、フィルタは権限がないことを検出しました。現在のページの URL が保存され、ログイン ページにリダイレクトされました。ログインが成功した場合、値が取得され、次の場所にリダイレクトされました。元のページ。 (ここで保存されたフラッシュ データを更新する必要がある場合があります)
  • セッションのランディング時間

私は単純に Session::put# が使用されていると考えていました##関数はこの変数を保存できます。したがって、私のコードは次のように書かれました:
class LoginController {

    public function login(){
        Session::put('key','value'); 
        print_r( Session::all() ); //取出来看看是否put成功
        exit;   //习惯性的调试都exit,不执行后续代码
        //return Redirect::to(/); 框架在return后还会有后续的代码执行的
    }
}

その結果、次のリクエストでセッションが見つからず、

app/storage/session ディレクトリにファイルは生成されませんでした。何かがおかしいと感じます。

後、インターネット上に

Session::save()というメソッドがあったので、それも使ってみたところ、セッションファイルが正常に生成されていました。したがって、LaravelはPHPのネイティブセッションを使用しないため、すべてのput

操作を書き込むのではなく、コントローラーの後に何かを実行してセッションをファイルに書き込む必要があると感じました。これによりIO操作が発生します。頻繁すぎると影響を受けます。パフォーマンス。

通話に関連するコードを表示します。 laravel がコンパイルされた後、bootstrap/compiled.php

class Middleware implements HttpKernelInterface
{
    ...
    public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
    {
        $this->checkRequestForArraySessions($request);
        if ($this->sessionConfigured()) {
            $session = $this->startSession($request); // 启动session
            $request->setSession($session);
        }
        $response = $this->app->handle($request, $type, $catch); // 调用controller的method
        if ($this->sessionConfigured()) {
            $this->closeSession($session);         //关闭session
            $this->addCookieToResponse($response, $session);
        }
        return $response;
    }
    ...

    protected function closeSession(SessionInterface $session)
    {
        $session->save();    // 保存session
        $this->collectGarbage($session);
    }
}

小提示:如果不知道函数调用情况,可以在controller中throw new Exception();,然后在/config/app.php的debug更改为debug=>true。可以看到函数的调用关系。

可以看见,在调用完controller之后,调用了session->save()的方法,来主动的保存session。这样session才能落地保存起来,如果在controller或者view里面写了exit;,那么session是不会被保存的,除非主动的写Session::save()才能手工的保存起来。因此在debug调试的时候千万要注意啊。

 

以上がLaravelのセッション有効期限について詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。