Apache + PHP同时使用多个脚本

时间:2013-03-08 07:20:08

标签: php ajax apache parallel-processing

美好的一天。

首先,抱歉我的英语不好=)

因此。我创建了脚本:

<?
sleep(10);
?>

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

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

所以,我开始思考,我的问题是“连接:保持活力”。我改变了我的剧本:

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

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

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

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

1 个答案:

答案 0 :(得分:5)

我知道这是一个老问题,但我遇到了同样的问题并用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']);
?>

现在尝试一下,打开第一个脚本,在新选项卡中打开年龄开放的第二个脚本,并在第一个仍然运行时立即更新进度!!这么容易吗?! ;)

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