【问题标题】:PHP background Script blocking connection for whole browserPHP后台脚本阻止整个浏览器的连接
【发布时间】:2011-10-14 17:17:17
【问题描述】:

我有以下问题:

通过 Ajax 调用 PHP 脚本。脚本本身使用以下几行关闭连接

ignore_user_abort(true);
header("Content-Length: 0");
header("Connection: close");
flush();

然后开始使用 phpMailer 在后台发送一堆邮件(在循环中并在每封邮件之后使用 sleep(1) - 将来我希望这是在发送 5 封邮件后的随机秒数)。使用 FireBug,我可以看到与脚本的连接直接终止。邮件也正在发送中。

但是,当脚本在后台运行时,我无法打开任何页面 - 它们会一直加载,直到后台脚本显然完成。奇怪的是:该脚本似乎并没有阻止整个服务器,因为连接限制仅适用于启动后台脚本的浏览器。因此,在我在 FireFox 中启动脚本后,我仍然可以在 Chrome 中访问服务器上的页面。

可能是什么原因?每个浏览器(每个会话,即......)是否有打开 MYSQLi 连接的限制 - 我在这个上找不到任何东西......或者浏览器(尽管 FireBug 说连接已终止)仍在等待脚本的响应?

我该如何解决这个问题? 提前感谢您的帮助。

【问题讨论】:

    标签: php ajax background connection phpmailer


    【解决方案1】:

    PHP 脚本无法关闭客户端服务器连接,除非退出。执行Connection: close 标头也不会执行任何操作,因为这是针对客户端-> 服务器请求的,并且无论如何都是默认操作,除非客户端特别请求Connection: keep-alive

    您看到的“在其他浏览器中工作”行为通常是由于 PHP 在请求处于活动状态时锁定了会话文件。不同的浏览器不会共享 cookie,因此每个浏览器都有自己的单独会话。因此,当 Firefox 与此后台请求绑定时,Chrome 正在使用的会话完全不受影响。

    如果您希望在等待此邮件脚本处理时继续能够使用 FF,请在进入邮件程序循环之前发出session_write_close()。这将关闭并解锁会话文件,并让您在 FF 的另一个选项卡中继续使用该站点。

    如果您希望此脚本真正独立于浏览器,那么它必须将pcntl_fork 自身置于后台。这个分叉的孩子可以处理处理,完全不附加到浏览器,原始脚本可以退出,允许关闭连接。

    【讨论】:

    • 嗨,马克!哇,我真的很感动——我没想到会在不到 5 分钟的时间内得到解释和解决我的问题的方法。我绝对没有记住会话文件锁定。非常感谢,确实解决了问题。
    猜你喜欢
    • 2014-10-30
    • 2022-11-10
    • 2013-06-18
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 2014-10-29
    • 1970-01-01
    相关资源
    最近更新 更多