2011-10-14 37 views
0

我有以下问题:PHP后台整个浏览器的脚本拦截连接

PHP脚本通过Ajax调用。在未来,我想 - 脚本本身使用(在一个循环中以下行

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

,然后开始发送了一堆使用的PHPMailer在后台邮件,并使用睡眠(1)每封邮件后关闭连接这是5次发送邮件后的随机数量)。使用FireBug,我可以看到与脚本的连接被直接终止。邮件也正在发送。

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

可能是什么原因?每个浏览器是否有开放的MYSQLi连接限制(每个会话,即...) - 我找不到任何东西......或者是浏览器(虽然FireBug说连接已经终止)为脚本的回应?

我怎么能解决这个问题? 在此先感谢您的帮助。

回答

6

PHP脚本不能关闭客户端< - >服务器连接,除非退出。做一个Connection: close头也不会做任何事情,因为这是客户端 - >服务器请求,并且是默认的动作,除非客户明确要求Connection: keep-alive

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

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

如果您希望此脚本真正独立于浏览器,那么它将不得不将pcntl_fork本身置于后台。这个分叉的孩子可以处理处理,完全不依赖于浏览器,并且原始脚本可以退出,从而允许连接关闭。

+0

嗨,马克!哇,我留下了深刻的印象 - 我不希望在不到5分钟的时间内为我的问题得到解释和解决方案。 我绝对没有考虑到会话文件锁。非常感谢,这确实解决了问题。 – Connum