0

次の明らかに役に立たないコードを見てください。

<?php
session_start();
$_SESSION["key-".rand(1,1000)] = time();
print_r($_SESSION);
die();

これをローカル マシンから実行すると、次のように出力されます。

Array
(
    [key-272] => 1341011374
)

コードをそのままにしてブラウザを更新すると、次のようなものが表示されます。

Array
(
    [key-272] => 1341011374
    [key-954] => 1341011374
    [key-895] => 1341011379
)

もう一度更新します。

Array
(
    [key-272] => 1341011374
    [key-954] => 1341011374
    [key-895] => 1341011379
    [key-337] => 1341011379
    [key-15] => 1341011869
)

など、 $_SESSION 配列に2 つのレコードを追加するたびに(1 つだけではありません)。また、追加されたレコードの各ペアで、最初の値は前に追加されたレコードと同じですが、キーは異なる方法で生成された乱数であることに注意してください。

ここで何が起こっているのか誰か説明できますか?

更新 1

コメントで他の人に言及したように、最初のリクエストは$_SESSION 値を1 つだけ設定し、その後は毎回 2 を設定することに注意してください。

2 番目のリクエスト以降、リクエストごとに 2 つの値を設定すると、タイムスタンプが異なります。リクエストが 2 回発生した場合、それらは同じか近いと予想されますが、その間に長時間待機した場合でも、各ペアの最初のタイムスタンプは常に前のリクエストのタイムスタンプと同じです。奇妙な。

更新 2

今、Firefox と Safari をチェックインしたところ、最初は少し奇妙な結果が得られましたが、リクエストごとに 1 つのレコードしか追加されず、すべてが期待どおりに機能しているように見えました。すべてのコードを削除し、ここに表示されているコードだけを残して、他のコードを含まないプレーンな index.php ファイルにしました。それでも、Chrome では、上で説明したのとまったく同じように動作します。

Chrome 中心の問題、または少なくとも Chrome 関連の問題のようですが、その理由についてはまだわかりません。スクリプトのすべてがべき等でない限り、それらを 2 回実行することはかなりひどいバグのように思えます...

4

1 に答える 1

0

これらのテストを開始する場合は、重複する可能性があるため、ランドでそれらを実行しないでください。その次に、少量のテスト (更新) だけでテストするのではなく、適切な量でテストを行います。多くのテスト フレームワークが何千ものリクエストを送信して実質的な結果を確認することで、これを行うことができます。また、さまざまなブラウザーでテストして、実際のテスト結果を取得してください。

セッションの定義に基づくと、意味がありません。画像やスタイルシートなどのリソースをロードすると、これらの問題が発生する場合もあります。

プリロードされている可能性があるため、同じアプリケーションの他のページへのリンクも確認してください。一般に、POST フォームはそうではありませんが、リンクはそうです。

この一般的な問題は、PHP の標準が原因である可能性は低く、バグではないという意味ではありません。ただし、非常に一般的な拡散言語で構造的な問題について考える前に、まず自分の側ですべてを確認してください。このようなバグがあれば、多くの Web サイトに損害を与えることになります。

于 2012-06-29T23:36:04.327 に答える