2017-03-27 9 views
1

複数のページがあるフォームがあります。私は$_SESSION配列を使用してユーザー入力を格納します。各ページはセッションがガベージコレクタによって削除されているか確認してください

session_start(); 

で始まり、時には$_SESSIONの変数が失われます。私は、ユーザーがあまりにも長い期間afkのままで、Garbage Collectorが変数を削除した場合、これが起こると思います。

正しく理解すると、session_status()はセッションが開始されたかどうかを確認するだけで、ガベージコレクタが最近エントリを削除した場合はチェックしません。

ガベージコレクタがアクティブになった場合、$_SESSION配列の一部またはすべてのエントリを削除しますか?私のセッションが期限切れになった場合、他の言葉では、私は単純に次のようにしてチェックすることができ:

session_start(); 
if(empty($_SESSION)){ 
    // Garbage Collecter removed entries because user was too long afk 
} 
+0

一部のエントリは削除されません。どちらかがそこにあるかどうか。 –

+0

@SergiuParaschivしたがって、ガベージコレクタがSESSIONを削除した後に 'session_start'を呼び出すと、' $ _SESSION'配列は空ですか? – Adam

+0

'' garbage collector 'は 'session_start'を実行すると同期して実行され、部分的に削除されたデータは決して見えません。 GCはすべてのセッションデータを削除します。 –

答えて

3

全体的なメカニズムは、おそらく思うほど洗練されていません。

セッションは、複数のストレージback-endsを持つことができ、デフォルトでは、単にも、作成組み込みファイルハンドラ、ファイルは次のとおりです。

Files in Windows Explorer

特定のセッションで指定したファイルをリンクする唯一の方法あなたが見ることができるように、ファイル名の一部であるセッションIDです。

ガベージコレクションは、最終更新日に基づいてファイルを削除します。一度それが起こると、ファイルは永遠に消えてしまいます。ファイルが存在したというトレースやレコードはありません。

一般的に、この場合は心配する必要はありません。あなたのアプリケーションに十分な長さの寿命を定義してください。多くのシステムのデフォルト値は、20〜30分の範囲であることが多く、これはかなり小さい値です。また、アプリケーションが独自のセッションディレクトリを持っていることを確認し、そう短い寿命を持つ他のアプリはあなたファイルは削除されません。

session_save_path('/home/foo/app/sessions'); 
ini_set('session.gc_maxlifetime', 86400); // 1 day (in seconds) 

P.S.を一部のLinuxシステムでは、PHPのガベージコレクションを無効にし、カスタムのcronスクリプトで置き換えて、カスタムの場所のクリーンアップを防ぎます。そのため、私は通常、これらの他のディレクティブを設定します。

// Restore the default values 
ini_set('session.gc_probability', 1); 
ini_set('session.gc_divisor', 100); 
+0

私は実際にこの質問に興味がありませんでしたが、あなたの答えは何か面白いことを教えてくれました。ほんの1つの提案:あなたの例で 'gc_probability'と' gc_divisor'を使用して以来、短いコメントで説明できるかもしれません。 – domsson

+1

@domdomあなたはhttp://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes/1270960#1270960 – Adam

+1

@domdomを読んでください。確かにそこにあります。 –

関連する問題