2009-03-31 1 views
6

$ _SESSIONのデータにアクセスするたびに、ディスク上のセッションファイルがすぐに更新されるのですか?または、データのnバイトごとに変更(フラッシュ)しますか?

この質問は、必ずしも特定のファイルセッションハンドラについてではなく、すべてのハンドラについてです。 (セッション中のすべての接触は、メモリ内に通常の変数を格納することのほかに、あらゆる種類のI/Oを直ちに呼び出すかどうか)。

答えて

3

Mattが書いたように、デフォルトでスクリプト実行の最後に書き込みます。あなたは、データが通常)session_write_closeを(コールする 必要なく終了 スクリプトの後に保存され、 が、セッションデータは にロックされているとして一つだけ スクリプト同時書き込みを防ぐれsession_write_close()

セッションで、ここでそれについて読むことができます任意の 時刻のセッションで動作することがあります。フレームセットを一緒に使用すると、 セッションでは、 ロックのために、フレームが1つずつロードされて になります。すべてのフレームをロードするのに、 が必要な時間を減らすことができます セッション変数への変更が完了するとすぐに、セッションを終了する

0

ハンドラによって異なります。あなたは自分のハンドラを書くことで、動作について絶対に確実にしたい場合に、好きなだけ頻繁に起こることを確認することができます。セッション変数の管理には6つのコールバックがあります。 「書き込み」と呼ばれるものは、実際のI/Oを実行する必要はなく、セッションファイルを書き込むことは、「閉じる」の呼び出しまで待つことができます。これは実装の詳細ですが、私が言ったように、ハンドラに依存します。

+0

プロセスがクラッシュすると、私は未書き込みのセッションデータが失われていると見なします。 –

+0

はい、コミットされていないデータベースアクションも失われている可能性があります。 – jmucchiello

2

私のセットアップでは、プロセスの最後とそれを書き込みます。私は、スクリプトを実行し、数秒待った後、プロセスIDに 'sudoを殺す' を走った

$_SESSION['foo'] = 'bar'; 
while(true) 

public function _session_write_method($id, $sess_data) { 
    var_dump(file_put_contents('/var/www/public_html/testing.txt', serialize($sess_data))); 
    return(true); 
} 

、その後:私は新しい_ session_のwrite_methodを作りました。シリアライズされたデータはファイルに書き込まれませんでした。私は無限ループなしでもう一度実行し、ページの最下部にint(22)があり、testing.txtには次の文字列が書き込まれました。s:14: "foo | s:3:" bar ";" ;

関連する問題