session_gc()はPHPの内部関数であり、その機能はセッションのゴミ収集メカニズムを実行することです。 PHPは、期限切れのセッションファイルをクリーンアウトするために、ユーザー要求に特定の確率でこの関数をトリガーします。デフォルトの動作は、次の3つの構成項目によって決定されます。
ini_get('session.gc_probability'); // デフォルト値:1
ini_get('session.gc_divisor'); // デフォルト値:100
ini_get('session.gc_maxlifetime'); // デフォルト値:1440 2番(24 分)
つまり、100個ごとに、session_GCがトリガーされる可能性があり、 GC_MAXLIFETIMEを超えるすべてのセッションファイルをクリアします。
PHPは、デフォルトでサーバーのファイルシステムにセッションデータを保存します(通常は/TMPディレクトリ)。 Session_GCが実行されるたびに、PHPはこのディレクトリのすべてのセッションファイルをスキャンして、どのセッションが有効になっているかを判断する必要があります。この操作は、セッションファイルの数が少ない場合に鈍感ですが、並行性が高い場合、またはセッション保持時間が長い場合、重要なI/Oオーバーヘッドにつながる可能性があります。
複数のリクエストが同時にsession_gcをトリガーする場合、ロック競合を引き起こす可能性があり、それが要求の詰まりを引き起こします。これは、高電流システムで特に危険です。少なくとも、応答速度を低下させ、最悪の場合、サーバーの負荷を直接埋めます。
最も一般的なアプローチは、PHPの自動GCをオフにすることです。これにより、システムはより制御された方法(Cronタイミングタスクなど)でコレクションをごみ収集できるようにすることです。
ini_set('session.gc_probability', 0);
次に、5分ごとにクリーニングロジックを実行するなど、時限タスクを設定します。
*/5 * * * * php /var/www/html/session_gc.php
session_gc.phpサンプルコードは次のとおりです。
<?php
ini_set('session.save_path', '/var/www/html/sessions');
ini_set('session.gc_maxlifetime', 3600); // 有効期限を設定します
session_start();
session_gc(); // 手動でクリーンアップを実行します
session.save_handlerをmemcachedまたはredisに構成することにより、セッションの読解効率を大幅に改善し、PHPファイルシステムGCのパフォーマンスの問題をこれらのシステムのネイティブの有効期間戦略の助けを借りて回避できます。
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://gitbox.net:6379');
Redis独自のTTLメカニズムは、手動介入なしで期限切れのセッションを自動的に削除できます。
PHP 7.1から、セッション.lazy_write構成アイテムが追加され、セッションファイルはセッションデータが変更された場合にのみ書き込まれます。 Session_GCとは直接的な関係はありませんが、不必要な書き込み操作を削減し、パフォーマンスを間接的に改善することができます。
ini_set('session.lazy_write', 1);
大規模な訪問のあるB2Cモールでは、元の構成により、数十万のセッションファイルが/TMPの下に蓄積されました。各session_GCの実行により、CPUが急上昇し、ページの応答時間が大幅に増加しました。
最適化計画は次のとおりです。
自動GCをオフにします。
Redisを使用してセッションを保存します。
バックグラウンドタスクは、午前2時に毎日1回session_gc() (代替)を実行します。
session.gc_maxlifetimeを7200秒に調整して、ログイン有効期間を延長します。
オンラインに進んだ後、システム全体の応答時間は平均で30%低下し、GCの実行時間は数秒から数十ミリ秒まで短縮されました。
Session_GCは「バックエンドタスク」ですが、そのデフォルトの動作は、高い並行性シナリオでパフォーマンスボトルネックになる可能性があります。その原則を理解し、実際のビジネスシナリオに基づいて構成をカスタマイズすると、PHPアプリケーションの安定性とパフォーマンスを効果的に改善できます。
ベストプラクティスの概要:
大規模なプロジェクトで自動GCを無効にし、タイミングタスクを使用します。
Redis/Memcachedを使用してセッションを保存してみてください。
妥当な構成でGC_MAXLIFETIMEを構成します。
session.lazy_writeを使用して、ディスクの書き込みを減らします。
これらのスキルを習得することは、パフォーマンスの欠点ではなくなります。