PHPのセッション-非同期リクエストの水中小石

少しの背景。


私は趣味のプロジェクトtracker.ruを持っています

アルゴリズムは次のとおりです。ユーザーが検索クエリを入力すると、このクエリは「オンザフライ」でサードパーティのトラッカー(rutor、rutraker、tfileなど)でトレントを検索します。

並列検索の場合、複数のAjaxリクエストが同時に送信されます。これらのリクエストは非同期で処理する必要があります。

ただし、リクエストは同期的に実行されました。 一部のトラッカーが長時間応答を返さなかった場合、残りの要求はハングし、中断されたトラッカーからの応答を待ちました。 クエリ実行時間の合計は、すべてのリクエストの合計です。 ただし、私の計画によると、合計時間は最長のリクエストに等しくなければなりません。

なぜそんなに困惑しました。 HTTPパイプライン化に罪を犯しました。 しかし、その理由はもっと一般的でした。 セッションがすべてです。 事実、PHPのセッションは一貫しており、PHPは別のプロセスがすでに占有されているセッションにアクセスすることを許可しません。



ここで結果を突いて楽しんでください 。 セッションがある場合とない場合の合計時間を確認します。



なぜこれが悪いのですか:


サイトの速度が低下した場合、このサイトの複数のタブを開くと、タブが順番に読み込まれます。

コンテンツに多数のajaxリクエストがロードされている場合、それらも順番に実行されます。



治療方法は?


セッションハンドラーを変更しても役に立ちません。 コメントでは、これはそうではないことを修正しました。

オプションとして-(これはすでにハブに書き込まれています)コードのクイックセクションで、セッションを使用してから、session_write_close()を実行します。



All Articles