8

データベースに関連してCIのセッションを使用しています。したがって、すべてのセッションはデータベースのこのci_sessionsテーブルにあり、session_idが5分ごとに変化し続けることを考えると、多くの行を取得できます。

テーブルを空にする必要がありますか?たとえば、月/週ごとに行う必要がありますか?

4

6 に答える 6

13

@Marc-Audetが言ったことは真実ですが、コードを見ると、セッションをクリーンアップするのが本当にお粗末な方法であることがわかります.

コンストラクターは、_sess_gc関数が開始されるたびに関数を呼び出します。したがって、基本的に、自動ロードされている場合、サーバーへの各リクエスト。

次に、100 未満の乱数を生成し、それが特定の値 (デフォルトでは 5) 未満かどうかを確認します。last_activityこの条件が満たされると、現在の時刻からセッションの有効期限を引いた値よりも小さい値を持つセッション テーブルの行が削除されます。

これはほとんどの場合に機能しますが、技術的には (世界が完全にランダムである場合) 乱数ジェネレーターが 5 未満の数値を長期間生成しない可能性があり、その場合、セッションはクリーンアップされません。

また、セッションの有効期限が長い時間に設定されている場合 (0 に設定すると、CI は 2 年に設定します)、それらの行は削除されません。そして、あなたのサイトがかなりの数の訪問者を獲得するのに十分であれば、あなたの DBA はすぐにセッションテーブルに指を向けるでしょう :)

ほとんどの場合に機能しますが、適切な解決策とは言えません。セッション ID の再生成は、以前の ID に関連するレコードを削除するように構築されている必要があり、ガベージ コレクションは乱数に任せるべきではありません。理論的には、必要な数が必要な頻度で生成されない可能性があります。 .

私たちの場合、セッション ライブラリからセッション ガベージ コレクションを削除し、1 日に 1 回手動で処理します (cron ジョブを使用し、適切なセッション有効期限を設定します)。これにより、DB への不要なヒット数が減り、DB に大量のテーブルが残ることもありません。大きなテーブルですが、昔に比べるとずいぶん小さくなりました。

于 2013-03-12T16:15:11.770 に答える
5

いいえ、CodeIgniterはそれ自体の後でクリーンアップします...

CodeIgniter
のドキュメントによると:

Sessionクラスには、期限切れのセッションをクリアするガベージコレクションが組み込まれているため、独自のルーチンを作成する必要はありません。

CodeIgniterのセッションクラスはおそらくセッションテーブルをチェックし、期限切れのエントリをクリーンアップします。ただし、ドキュメントには、クリーンアップがいつ行われるかは記載されていません。CodeIgniterの一部としてcronジョブがないため、Sessionクラスが呼び出されたときにクリーンアップを実行する必要があります。サイトが永久にアイドル状態のままである場合、セッションテーブルがクリアされることはないと思います。しかし、これは珍しいケースです。

于 2013-03-12T12:14:14.953 に答える
1

電話すると:

$this->session->sess_destroy();

データベース内の情報を自動的に削除します。

于 2013-03-12T12:15:06.680 に答える
-2

テーブルをクリアすることは常に良い習慣です。そうしないと、たとえばレポートの作成などのためにセッションデータをクエリすると、速度が遅くなり、信頼性が低下します。それにもかかわらず、mysqlのパフォーマンスを考えると、そうです。

于 2013-03-12T12:15:03.980 に答える