4

まず、私の具体的な質問です。これは機能するはずですか?

<?php 
    session_start();
    $_SESSION['test']='TEST_CONTENT';

    echo '1: ',$_SESSION['test'];
    echo '<br>';

    session_write_close();

    echo '2: ',$_SESSION['test']
?>

さて、いくつかの背景情報。Frameset を使用した Web アプリケーションを使用しており (開始しないでください...いいえ、これを変更するお金はありません)、場合によっては SESSION 変数がデータベースに書き込まれていないことがわかりました! いくつかの困難なテストの後、2 つのフレームが同時にロードされていることがわかりました。これはほとんど発生しませんが、最初に呼び出されたフレームが 2 番目のフレームの後に終了しました。最初に呼び出されたフレームは、以前に作成されたコピーでセッションを上書きしていました (スクリプトの最後にセッションを書き込むため)。

私たちの解決策は、最初に呼び出されたフレームでできるだけ早く session_write_close() を呼び出すことですが、セッション変数を引き続き (100% 確実に) 読み取ることができるかどうかが懸念されます。

4

1 に答える 1

1

よく考えれば、別の方法で実装できます。

それを実装する方法は静かで簡単です

session_start();
$_SESSION['timestamp'] = time();

これは、スクリプトの上に配置されます。

スクリプトが停止すると、データベースに保存されますが、停止を待ってください。完了ではありません:P

次に、現在のレコードのタイムスタンプが高いか低いかを確認します。それより低い場合は更新し、そうでない場合は更新を忘れて何もしません。microtime() を考慮する必要があります。人々は f5 を押すのが好きだからです。

とても新しいアイデアで、少しうまく機能し、生産を節約できると思います


コメントに答えるには:

session handlerを見てください。php がセッションを処理する独自の関数を作成できます。したがって、コードをリファクタリングする必要はなく、追加するだけです。

次に、書き込み部分で、データベースに対して、ID x のレコードを更新し、タイムスタンプが指定された値よりも大きいことを伝えます。

実装のために、レコードのタイムスタンプ/分時間に列を追加する必要があります。そして、セッションハンドラーでは、リクエストされた時間を節約できます。だから、比較を行うことができます。次に、セッションで時間を保存する必要はありません:) ($_SESSIONではなく、dbに保存されます!)

于 2013-06-06T13:37:34.187 に答える