web-dev-qa-db-ja.com

コアはデータベース内の期限切れセッションのクリーンアップをどのようにトリガーしますか?

core/lib/Drupal/Core/Session/SessionHandler.phpは、データベース(セッションテーブル)から期限切れのセッションをクリアするメソッド(gc())を定義します

それはいつトリガーされますか?インターフェイスからそれをトリガーする方法はありますか?

手動で、またはcronやカスタムのDrushコマンドを使用して、セッションを切り捨てることができることはわかっていますが、コアがそれをどのように使用し、デフォルトでそれをトリガーするのかと思います

ありがとう

5
izus

ガベージコレクションの構成

セッションが開くと、PHPは_session.gc_probability_/_session.gc_divisor_によって設定された確率に従ってランダムにgcハンドラーを呼び出します。たとえば、これらが設定された場合それぞれ5/100の場合は5%の確率を意味し、同様に3/4は呼び出される可能性が4分の3の確率、つまり75%を意味します。

ガベージコレクションハンドラーが呼び出されると、PHPはphp.iniディレクティブに格納されている値を渡します__session.gc_maxlifetime_。このコンテキストでの意味は、_gc_maxlifetime_より前に保存された保存済みセッションを削除する必要があることです。これにより、アイドル時間に基づいてレコードを期限切れにすることができます。

しかし、一部のオペレーティングシステム(Debianなど)は独自のセッション処理を実行し、_session.gc_probability_変数を0に設定してPHPガベージコレクションの実行を停止します。そのため、Symfonyはこの値を1に上書きします。 。

php.iniに設定されている元の値を使用する場合は、次の構成を追加します。

_# config/packages/framework.yaml
framework:
    session:
        gc_probability: null
_

出典: Symphonyのセッションの構成とハンドラーの保存に関する公式ドキュメント

Drupalこれは/sites/default/default.settings.phpにあります)

_/**
 * Some distributions of Linux (most notably Debian) ship their PHP
 * installations with garbage collection (gc) disabled. Since Drupal depends on
 * PHP's garbage collection for clearing sessions, ensure that garbage
 * collection occurs by using the most common settings.
 */
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 100);
_

上記の「最も一般的な設定」は1/100に設定されているため、ガベージコレクションは1%の時間で実行されます。

今、コードのコメントに従って、自動生成された場合、これがsettings.phpに入れられないと思います。私のsettings.phpにこれが表示されていないため、ディストリビューションのファイルの1つにすでに1つ設定されている場合、

これをservices.ymlこの回答に示されているように として設定することもできます。


結論として

DrupalはSymphonyの上に構築されていますが、これはSymphonyに依存していないことに注意してください。ドキュメントから素敵な説明を引用しました。

PHPは自動的にこのgc()メソッドを_session.gc_probability/session.gc_divisor_%の時間ごとに呼び出し、PHP docs SessionHandler。

SessionHandlerは、継承によって現在の内部PHPセッション保存ハンドラを公開するために使用できる特別なクラスです。 7つの内部セッション保存ハンドラーコールバックをラップする7つのメソッド(open、close、read、write、destroy、gc、create_sid)。

ソース: http://php.net/manual/en/class.sessionhandler.php

core/lib/Drupal/Core/Session /SessionHandler.php

_/**
 * Default session handler.
 */

class SessionHandler extends AbstractProxy implements \SessionHandlerInterface { ...

 /**
   * {@inheritdoc}
   */
  public function gc($lifetime) {
    // Be sure to adjust 'php_value session.gc_maxlifetime' to a large enough
    // value. For example, if you want user sessions to stay in your database
    // for three weeks before deleting them, you need to set gc_maxlifetime
    // to '1814400'. At that value, only after a user doesn't log in after
    // three weeks (1814400 seconds) will his/her session be removed.
    $this->connection->delete('sessions')
      ->condition('timestamp', REQUEST_TIME - $lifetime, '<')
      ->execute();
    return TRUE;
  }
_
5
No Sssweat