2

再会。

首先,对不起我的英语不好=)

所以。我创建了脚本:

<?
sleep(10);
?>

我的 Apache 有 MPM 模块,我显然没有在这个脚本中使用会话,只是……只是睡眠(10)。当我同时在浏览器中打开 2 个选项卡时,第一个选项卡会在 10 秒内加载,第二个选项卡会在 20 秒内加载。

但。当我同时在 2 个不同的浏览器中打开此脚本时,它会在 10 秒后加载每个浏览器。

所以,我开始想,我的问题是“连接:保持活动”。我改变了我的脚本:

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

phpinfo() - 可以肯定的是,标头是在 sleep() 之前发送的。Buuuut ...我遇到了同样的问题。在 Chrome 的第一个选项卡中,我得到带有“连接:关闭”的标题,在第二个选项卡中,当第一个脚本未结束时,我无法获取响应标题。在两种不同的浏览器中- 一切正常。

现在我完全不知道我做错了什么。为什么 Chrome 不能对我的网站进行 2 个并行查询?我应该怎么做才能解决这个问题?

PS我不想为我的所有网站禁用keep-alive。我不介意,它是否会加快 CSS、图像和其他内容的加载速度。甚至其他脚本。但我希望能够在一个浏览器中并行运行一些脚本。PPS 例如:在一个页面上会有很长的 ajax 查询,例如 - 在服务器端处理一些大数据和间隔很小的 ajax 查询 - 以获得执行第一个查询的状态。显然,它们必须是平行的。

4

1 回答 1

8

我知道这是一个老问题,但我遇到了同样的问题并用session_write_close()! 没有它,PHP 会故意将同一会话的脚本排队。

最简单的例子:

龙脚本#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']);
?>

现在试试看,打开第一个需要很长时间的脚本在新选项卡中打开第二个脚本,并在第一次仍在运行时立即更新进度!这么简单对吧?!;)

ajax 轮询长脚本和第二个 ajax 调用以获取进度的原理相同!

于 2016-07-12T16:41:37.990 回答