php - AJAXを介して大規模なデータセットを処理しても速度のメリットはありません

php ajax database symfony1

実行するのに時間がかかるデータベースクエリがいくつかあります。それぞれは、Webページで選択されたオプションからトリガーされるように構築されています。いくつかのAJAXリクエストを介して作業を開始することで、私はかなりずる賢いと思っていました。

私は、複数のリクエストが複数のプロセス/スレッドに分割され、ユーザーの作業が比較的迅速に完了すると想定していました。

ただし、リクエストは連続して処理されているようです。つまり、ユーザーには速度上のメリットは感じられません。

さらに悪いことに、ページを更新するAJAXリクエストも列で待機します。つまり、前のリクエストがすべて完了するまで、リクエストは応答しません。

これは、PHPセッションがロックされていることが原因である可能性があるとreadしています。

この種の問題に対する通常のアプローチは何ですか?


AJAXリクエストを非同期で動作させる方法はありますか?
PHPによるセッションのロックを停止できますか?
バックグラウンドの仕組みを起動するために、cronを介して別のプロセスを使用する必要がありますか?


ありがとう!

NBこのプロジェクトはsymfonyフレームワークを使用して構築されています。

AJAXはjQueryを使用します

// Get the content
$.get('/ajax/itemInformation/slug/'+slug, function(data) {
  $('#modal-more-information').html(data);
});
答え
特定のAJAX要求のいずれかでセッションをまったく使用している場合、それらは要求の順序で効果的に連続的に実行されます。これは、オペレーティングシステムレベルでのセッションデータファイルのロックが原因です。これらの要求を非同期にするには、セッションをできるだけ早く閉じる(または開始しない)ことが重要です。

session_write_close(docs)を使用して、できるだけ早くセッションを閉じることができます。私はこれにいくつかのヘルパー関数を使用したいのですが、以下のset_session_var関数がセッションを開き、変数を書き込んでから、セッションを閉じます。ページが読み込まれたら、session_startを呼び出して$_SESSION変数に値を入力し、すぐにsession_write_closeを呼び出すことができます。それ以降は、以下のset関数のみを使用して書き込みます。

$_SESSIONグローバルを単に参照できるため、get関数は完全にオプションですが、デフォルト値を提供し、コードの本体で3進数を1つ少なくできるため、これを使用します。

function get_session_var($key=false, $default=null) {
    if ($key == false || strlen($key) < 0)
        return false;
    if (isset($_SESSION[$key]))
        $ret = $_SESSION[$key];
    else
        $ret = $default;
    return $ret;
}
function set_session_var($key=false, $value=null) {
    if ($key == false || strlen($key) < 0)
        return false;
    session_start();
    if ($value === null)
        unset($_SESSION[$key]);
    else
        $_SESSION[$key] = $value;
    session_write_close();
}


AJAXリクエストが完全に非同期になると、まったく新しい一連の考慮事項があることに注意してください。ここで、race conditionsに注意する必要があります(1つの要求が別の要求に影響を与える可能性がある変数を設定することに注意する必要があります)-セッションを閉じると、1つの要求の$_SESSIONへの変更が見えなくなりますそれが値を再構築するまで、別のリクエスト。重要な使用の直前に$_SESSION変数を「再構築」することで、これを回避できます。

function rebuild_session() {
    session_start();
    session_write_close();
}


...しかし、これは依然として競合状態の影響を受けます。
関連記事

php - 変化しているファイルを恐れる

php - グループのFacebookアプリケーションを作成する方法

php - PHP変数をJavaScriptとJavaScriptのifステートメントに渡す[重複]

php - Codeigniterでのウォーターマークの回転

php - コメントの投稿後にユーザーをリダイレクトする方法

php - Wordpress:実行時間の長いプラグインスクリプトによってブロックされたフロントエンド

php - 古いPHPコードをオブジェクト指向にするためのデザインパターン

php - PHP関数に渡された変数の名前を取得しますか?

php - PHPとinterbaseのヘルプ

php - ホストのphpプロセスを強制終了