web-dev-qa-db-ja.com

PHPセッションディレクトリはオーバーフローするまでいっぱいになります

PHPセッションデータフォルダに問題があります。セッションの有効期限が切れていないようで、ディレクトリ内のファイルに対するファイルシステムの制限など、何らかの制限に達しています。セッションの書き込みを伴うリクエスト十分なディスク容量がないため、致命的なエラーで失敗します。

sessions.save_pathに新しいディレクトリを指定することで、一時的に回避しました。

セッションの期限切れを妨げているphp.iniの何が問題なのか知りたいのですが。

また、sessionsを使用してrmディレクトリを切り詰めてみましたが、永久にハングしているようです。

問題ディレクトリ:

drwxr-xr-x  2 www-data www-data 294215680 Jan  5 13:42 sessions

php.iniのセッションセクション:

[Session]
session.save_handler = files
session.save_path = "N;/var/www/data/sessions"
session.use_strict_mode = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 2592000
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 0
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5
2
Tony H
session.save_path = "N;/var/www/data/sessions"

(PHPは明らかにセッションを生成しているので)は問題を引き起こしているようには見えませんが、正しくありません。

このオプションの2つの形式は次のとおりです。

/path/to/sessions
N;/path/to/sessions

integerNは、指定したパスの下に作成するサブディレクトリの数を定義します。多くのセッションファイルが予想される場合に、セッションファイルを多数のディレクトリに分散するのに役立ちます。 (あなたはすでにシステムが1つのディレクトリにたくさんのファイルを好まないことを発見しました...)

session.gc_probability = 0

これは主な問題である可能性が高いです(PHPがこれを誤って0に設定しているユーザーを自動的に処理する場合を除く)

クリーンアップが行われる確率は、probability/divisor0/1000は0なので、実行される可能性はほとんどありません。

編集:ファイルの削除に関しては、ファイルが完了するまで待つ必要があるかもしれません。数百万のファイルの場合、おそらくハングしているように見えます。

5
USD Matt

セッションファイルをクリーンアップするにはcronジョブが必要ですが、それら自体ではクリーンアップされません。 Ubuntu/Debianにはスクリプト(/etc/cron.d/php)クリーンアップを自動的に実行します。

そのようなスクリプトがない場合は、find /var/www/data/sessions -cmin +1440 -print0 | xargs -0 -r rm cronジョブ。

24時間以上経過したファイルをクリーンアップします。

2
ThoriumBR

設定には、次の設定が含まれています。

session.save_path = "N;/var/www/data/sessions"

これは間違っているようです。 session.save_path の先頭のNである必要がありますセッションファイルの配布に使用されるサブディレクトリレベルの数を定義する整数

「正しく」か「N」を使用しても、マニュアルによるガベージコレクションが防止され、古いセッションファイルを削除するにはcronジョブが必要になります。

このディレクティブにはオプションのN引数があり、セッションファイルが分散されるディレクトリレベルの数を決定します。たとえば、"5;/tmp"に設定すると、セッションファイルと/tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174のような場所が作成される可能性があります。 。 [〜#〜] n [〜#〜]を使用するには、これらのディレクトリをすべて作成してから、 use。これを行うための小さなシェルスクリプトがext/sessionに存在します。これはmod_files.shと呼ばれ、Windowsバージョンのmod_files.batと呼ばれます。また、Nが使用され、0より大きい場合、自動ガベージコレクションは実行されません。php.iniのコピーを参照してください。詳細については。また、セパレーター(;)はphp.iniのコメントにも使用されるため、Nを使用する場合は、必ずsession.save_pathを「引用符」で囲んでください。

2
HBruijn