PHP には、メモリ スコープ内にないオブジェクトを実際にガベージ コレクションする非常に単純なガベージ コレクタがあります。ガベージ コレクションの内部的な動作では参照カウンターを使用するため、カウンターが 0 に達すると (オブジェクトへの参照が利用できないことを意味し)、オブジェクトはガベージ コレクションされてメモリから削除されます。
すべてのコンピューター言語には独自の自動ガベージ コレクション メカニズムがあるため、プログラマーはプログラムのメモリ割り当てについてあまり心配する必要はありません。ただし、オブジェクト指向プログラミング (OOP) プログラミングでも例外ではありません。一部のオブジェクトは、プログラム実行メモリがオーバーフローしないように表示する必要があります。
1. PHP ガベージ コレクター (GC)
PHP では、オブジェクトを指す変数がない場合、オブジェクトはガベージになります。 PHP はこれをメモリ内で破棄します。これは、メモリのオーバーフローを防ぐための PHP の GC ガベージ処理メカニズムです。
PHP スレッドが終了すると、現在占有されているすべてのメモリ領域が破棄され、現在のプログラム内のすべてのオブジェクトが同時に破棄されます。通常、GC プロセスはセッションごとに実行を開始します。gc の目的は、セッション ファイルが期限切れになった後に自動的に破棄して削除することです。 __destruct() デストラクタは、ガベージ オブジェクトがリサイクルされるときに実行されます。
unset は、オブジェクトではなく、オブジェクトを指す変数を破棄します。
3. セッションと GC
PHP の動作メカニズムにより、セッション情報を定期的にスキャンしてセッション情報が無効かどうかを判断するデーモン スレッドがありません。有効なリクエストが発生すると、PHP はグローバル変数 session.gc_probability および session.gc_divisor の値に基づいて GC を有効にするかどうかを決定します。デフォルトでは、session.gc_probability=1、session.gc_divisor = 100 は、GC を開始する可能性が 1% であることを意味します (つまり、100 リクエストのうち 1 つの GC のみが 100 リクエストの 1 つで開始されます)。
GC の仕事は、すべてのセッションをスキャンすることです。最終変更時刻が session.gc_maxlifetime パラメータと比較され、生存時間が gc_maxlifetime (デフォルトは 24 分) を超える場合、セッションは削除されます。 ただし、Web サーバーに複数のサイトがある場合、GC が複数のサイトでセッションを処理すると予期しない結果が生じる可能性があります。その理由は、GC が動作しているときに、異なるサイトのセッションが区別されないためです。
では、この時点でどうやって解決すればいいのでしょうか?
1. session.save_path を変更するか、session_save_path() を使用して各サイトのセッションを専用のディレクトリに保存します。
2. GC 起動率を指定します。増加すると、それに応じてシステムのパフォーマンスが低下するため、お勧めできません。
3. コード内の現在のセッションの生存時間を確認し、session_destroy() を使用して削除します。