web-dev-qa-db-ja.com

DebianのPHP sessioncleanスクリプトが最初に開いているすべてのファイルに触れるのはなぜですか?

私は勉強してる /usr/lib/php/sessionclean 現時点では。よくわからないことが一つあります。クリーンアップする前に、開いているすべてのセッションファイルを変更する目的は何ですか?これにより、現在開いているがまだ書き込まれていない期限切れのセッションが削除されないことを理解しています。しかし、これはまだ競合状態ではありませんか? PHPプロセスがtouchコマンドとdeleteコマンドの間に期限切れのセッションファイルを開いた場合はどうなりますか?

2
user2323470

findコマンドがそれらを評価するときに、最大存続期間よりも古いセッションファイルは削除されます。

PHPスクリプトの実行が完了すると、遅くともファイルが更新されます。ただし、実行中にアイドル状態になっているセッションを強制終了することは公平ではありません。したがって、touch現在実行中のphpプロセスがあるセッションファイルの変更時刻を更新します。

はい、phpプロセスがtouchの後に開始し、古すぎるセッションを再開し、findがガベージコレクションを実行する前に終了しなかったために削除されるという競合状態があります。セッションはすでに存続期間全体にわたって存在しており、おそらく数分間です。 2番目のウィンドウのほんの一部に拡張機能がないことは大した問題ではありません。


代わりに、PHPの組み込み実装は、実行時にガベージコレクションを実行する可能性が1%ほどあります。ボリュームの少ないサイトでは、確実にトリガーされない場合があります。

さらに、外部スクリプトを使用すると、セッションディレクトリのセキュリティをロックダウンできます。これが、Debianメンテナがそのようにした理由です。

3
John Mahowald