2

いくつかのアクションを実行するループがあり、ループ内に増分するセッション カウンターがあります。このループが完了するまでに約 10 ~ 15 分かかるため、ユーザーにループの進行状況を示すプログレス バーが必要です。

私のAJAX呼び出しは、ループ内で設定したセッションの値を取得することを想定していますが、機能していないようです。未定義のインデックス エラーが発生します。

セッションが1つのスクリプトで使用されるとロックされ、使用が終了するまでロックが解除されないことをどこかで読みました。私のajaxスクリプトがセッションの値を取得できるように、セッションで強制的にロックを解除することは可能ですか?

例:

スクリプト 1 (ループ):

while(SOME CONDITION) {
    //DO ACTIONS

    $_SESSION['progress'] = $currProgress + 1;
}

スクリプト 2 (AJAX コール取得セッション):

function getCurrentProgress() {
   $progress = isset($_SESSION['progress']) ? $_SESSION['progress'] : 0;
   echo json_encode(array('progress' => $progress));
}

JS AJAX (30 秒ごとに呼び出す) を上記のスクリプトに

4

1 に答える 1

2

PHP セッションの変更は、デフォルトではプログラムが終了するまでセッション ストレージに書き込まれません。プログラムの実行中$_SESSIONは、他の変数と同じです。独自のプログラム内でのみアクセス可能。プログラムが終了し、セッションがディスクに書き込まれたときにのみ、次のプログラムがセッション データに加えた変更を取得できます。したがって、簡単に言えば、セッションをチェックして最新の更新がそこにあることを期待するだけでは、これを行うことはできないということです。

関数を使用して、プログラム中にいつでも PHP にセッションへの書き込みを強制できsession_write_close()ますが、関数名からわかるように、これによりそのプログラムへのセッションも閉じられるため、プログラムはそれ以上更新できなくなります。それに。

その後、セッションを再開できると思いますが、それは危険な領域に足を踏み入れ始めています。うまくいったとしても、非常に非効率的です。

最終的に、PHP セッションは他の出力と同様にファイルに書き込まれますが、それを繰り返し開いたり閉じたりすると、かなりのオーバーヘッドが生じます。したがって、上記のことを検討している場合は、忘れてください。プログラムに進行状況を一時ファイルまたはデータベースに書き込むようにすることもできます。または、パフォーマンスが必要な場合は、memcache を使用してください。

于 2013-09-03T13:46:14.877 に答える