2

良い一日。

まず、下手な英語でごめんなさい =)

そう。スクリプトを作成しました:

<?
sleep(10);
?>

私の Apache には MPM モジュールがあります。明らかに、このスクリプトではセッションを使用していません。単に sleep(10) だけです。ブラウザで 2 つのタブを同時に開くと、最初のタブは 10 秒でロードされ、2 番目のタブは 20 秒でロードされます。

しかし。このスクリプトを 2 つの異なるブラウザーで同時に開くと、それぞれのブラウザーで 10 秒後に読み込まれます。

だから、私の問題は「接続:キープアライブ」だと思い始めました。スクリプトを変更しました:

<?
  header('Connection: close');
  phpinfo();
  sleep(10);
?>

phpinfo() - 確かに、ヘッダーは sleep() の前に送信されました。Buuuut... 私は同じ問題に遭遇します。Chrome の最初のタブでは、「接続: 閉じる」というヘッダーを取得します。2 番目のタブでは、最初のスクリプトが終了していない間、応答ヘッダーを取得できません。2 つの異なるブラウザーでは、すべて正常です。

そして今、私は自分が何を間違っているのかまったくわかりません。Chrome がサイトに対して 2 つの並列クエリを作成できないのはなぜですか? この問題を解決するにはどうすればよいですか?

PS すべてのサイトでキープアライブを無効にしたくありません。CSS、画像、その他のものの読み込みが高速化されるかどうかは気にしません。他のスクリプトでも。しかし、1 つのブラウザーでいくつかのスクリプトを並行して実行できるようにしたいと考えています。PPSたとえば、1ページで非常に長いajaxクエリになります。たとえば、サーバー側で大きなデータを処理し、少し間隔を置いてajaxクエリを処理して、最初のクエリの実行ステータスを取得します。明らかに、それらは平行でなければなりません。

4

1 に答える 1

8

私はそれが古い質問であることを知っていますが、私はちょうど同じ問題を抱えていて、それを解決しましたsession_write_close()! これがないと、PHP は意図的に同じセッションのスクリプトをキューに入れます。

最も簡単な例:

Looong スクリプト #1:

<?php

$_SESSION['progress'] = 0;

for ($i=0; $i < 100; $i++)
{
    session_start();
    $_SESSION['progress']++;
    session_write_close();
    sleep(1);// This is slowing script purposely!
}

?>

短いスクリプト #2:

<?php
session_start();
print_r($_SESSION['progress']);
?>

試してみてください。時間がかかる最初のスクリプトを新しいタブで開き、2 番目のスクリプトを開き、最初の実行中に進行状況を瞬時に更新します。とても簡単ですよね?;)

進行状況を取得するための ajax ポーリングの長いスクリプトと 2 番目の ajax 呼び出しの原則は同じです!

于 2016-07-12T16:41:37.990 に答える