4

マニュアルから、php セッション変数が設定されると、session_save_path フォルダー内のテキスト ファイルに書き込まれることを示します。

インタープリターがセッション変数のある行に到達するとすぐにこれが発生するのか、それとも PHP インタープリターがファイルの処理を終了したときに (テキスト ファイルへの書き込み) が発生するのかを知りたいだけです。

たとえば、連続する 2 行でセッション変数を設定および更新する場合 (以下の例のように)、PHP インタープリターはファイルを 2 回続けて保存しますか?

つまり、どのコード スニペットに適切なコメントが含まれているのでしょうか?

$_SESSION['my_variable']=1; // writes to the session text file
$_SESSION['my_variable']=2; // writes to the session text file again
die();                      //   

versus 

$_SESSION['my_variable']=1; // updates the session file contents in the memory
$_SESSION['my_variable']=2; // updates the session file contents in the memory
die();                      // writes to the session text file
4

4 に答える 4

4

次の場合、データはファイルに書き込まれます。

  • session_write_close() が呼び出されます
  • スクリプトの実行が終了しました

したがって、1)を行わない限り、2番目の仮定は正しいです。

変数が変更されるたびにファイルに書き込むと、非常にコストがかかります。一般的に言えば、ディスクへのアクセスと書き込みは遅いため、PHP がそれを行わない理由です。ただし、me​​mcache や redis などのキャッシング システムは、変更が発生したときに変更保存することに注意してください。そのため、PHP セッションが信頼性の面で十分でない場合は、それらに依存することをお勧めします。

于 2012-07-12T14:47:48.480 に答える
2

そこで、次のようにしてこれをテストしようとしました。

test_1.php

session_start();
$_SESSION['my_variable']=1;
sleep(20);
exit;

test_2.php

session_start();
var_dump($_SESSION);

私がテストしたケースは次のとおりです。

  • 実行test_1.phpし、すぐに実行しtest_2.phpます。

結果: 眠り終わるtest_2.phpまで凍りつく。test_1.php

  • 実行test_1.phpPHPSESSIDCookie の削除、および THEN 実行test_2.php

結果: test_2.phpフリーズせずにすぐに実行され(test_1.phpその間はまだスリープ状態でした)、空の配列が出力されました。



初心者の結論:

PHP は、スクリプトの実行が終了するまでそのセッションに関連するテキスト ファイルへのストリームを開き、変更を「コミット」します。(私は専門家ではないので、私の用語は正確ではないかもしれません)

編集:ドキュメントを参照していないため、さらに別の役に立たないテスト

ただし、同時書き込みを防止するためにセッション データがロックされるため、一度に 1 つのスクリプトのみがセッションで操作できます。

于 2012-07-12T15:06:53.517 に答える
2

2 つ目は、配列$_SESSION[...] = ...内に値を設定し、この関数をトリガーするだけです。$_SESSIONdie()

session_write_close

(PHP 4 >= 4.0.4、PHP 5)

session_write_close — セッション データを書き込み、セッションを終了する

バグを報告する 説明

void session_write_close ( void ) 現在のセッションを終了し、セッション データを保存します。

通常、セッション データは、 session_write_close() を呼び出す必要なくスクリプトが終了した後に保存されますが、同時書き込みを防ぐためにセッション データがロックされるため、一度に 1 つのスクリプトしかセッションで操作できません。フレームセットをセッションと一緒に使用すると、このロックにより、フレームが 1 つずつ読み込まれます。セッション変数へのすべての変更が完了したらすぐにセッションを終了することで、すべてのフレームをロードするのに必要な時間を短縮できます。

http://nl.php.net/manual/en/function.session-write-close.php

于 2012-07-12T14:37:34.937 に答える
-1

セッションは、setter ページをフラッシュした後にのみ、Cookie または選択したストレージに書き込まれます。元:

pageA と pageB を持つ:

pageA の設定:

session["foo"] = "バー";

session["foo"] は、次の後にのみ pageB で使用可能になります


ページ A からページ B に移動するか、ページ A から離れてページ B を更新
する

それを考慮して、私見の最良の定義は2番目のものです。

ハッピーコーディング!

于 2012-07-12T14:46:15.053 に答える