2011-01-20 3 views
0

ユーザーのセッションIDを名前にして、サーバーにユーザーがアップロードしたファイルを保存するアップロード機能を作成しています。今、私は、そのセッションがアクティブになるまで、このファイルをサーバ上に保持したいと思います。特定のIDを持つセッションが期限切れになっているかどうかを確認します。

私の質問は、session-idからセッションをアクティブにするか期限切れにするかを後で判断して、ユーザーがアップロードしたファイルを安全に削除できるようにすることです。

これは私が決して前にそれを使用したことはありませんが、特定の間隔でクリーンアップとしてやりたいことがあります。

+0

期限切れのセッションを削除するのはウェブサーバーの仕事だということを覚えている限り、おそらくこのメカニズムに触れることができますか? – Mchl

+0

@Mchlはい、期限切れのセッションを削除するのはサーバーの仕事だが、そうしたいとは思わない。私は、彼のセッションが期限切れになっている場合、または私のサーバーのスペースを占有している多くの不要なファイルが存在する場合は、ユーザーのアップロードファイルを削除したい。 –

答えて

2

この時間が過ぎるとセッションはガーベジとしてマークされ、ガベージコレクタはデフォルトで1%の確率(session.gc_probability)で開始されるだけなので、session.gc_maxlifetimeに頼ることはできません。

IMHOより良い方法は、期限切れのデータを処理することです。

あなたは、インスタンスのための時間を開始し、セッション変数に保存することができます:

<?php $_SESSION['last_seen'] = time();//Update this value on each user interaction. ?> 

Later..viaのcronのは、あなたがこのような何かを行うことができます。

<?php 
//Get the session id from file name and store it into the $sid variable; 
session_id($sid);//try to resume the old session 
session_start(); 
if (isset($_SESSION['last_seen']) && $_SESSION['last_seen'] > $timeout){//Session is expired 
    //delete file 
    session_destroy(); 
}else if (!isset($_SESSION['last_seen')){ //already garbaged 
    //delete file 
    session_destroy(); 
} 
?> 

テストされていません...ただのアイデア

+0

ありがとうございました。あなたに知らせようとします。 –

0

間隔は次のように行うことができます - > PHPスクリプト実行されている - - 誰かがあなたのWebが開いたファイルは、時間outedであれば>それはチェック - >時間otedファイル

そして

:-)不要CRONを削除します

ユーザーがブラウザウィンドウを閉じても閉じていないと情報が不足していると判断することはほとんど不可能です(閉じていないのにスリープモードをオンにして2日後に戻る - セッションはまだAFAIKです) - 最良の方法でこの問題をスローするアイデアだけは、AJAXチェックを使用して独自のセッションエンジンを使用することです。

+0

これはcronから遠ざかるための良いヒントです:)しかし、セッションが期限切れかどうかを知るには多分、セッションファイルを調べるべきでしょう。その創造の日付を失った時間または何かと比較する。 –

+0

ファイルのタイムアウトをテストするのが簡単ではありませんか?セッションの最後のアクセスを保存するだけで、古いセッションを殺すことができます(はい、2日間1セッションを維持することが可能です) – SergeS

2

私はまったく同じことをしようとしています。 1つの解決策は、session_set_save_handler()でカスタムガベージコレクタ関数を定義することです。このカスタム関数では、セッションに関連付けられているアップロードされたファイルを削除し、ディスクからセッションを削除します。あなたがセッションを処理するためにPHPに依存していない場合

bool session_set_save_handler (callback $open, 
           callback $close, 
           callback $read, 
           callback $write, 
           callback $destroy, 
           callback $gc) 

これは簡単です:私はそれを参照してください唯一の問題は、あなたにもセッションハンドラの残りの部分を定義する必要がありますということです。カスタムハンドラ関数からPHPのデフォルトハンドラ関数を呼び出す方法はありますか?

関連する問題