我如何提前关闭连接?

我正在尝试执行一个AJAX调用(通过JQuery),它将启动一个相当长的过程。我希望脚本只发送一个响应,指示进程已经启动,但是JQuery在PHP脚本运行完成之前不会返回响应

我尝试过使用“关闭”标题(如下),也尝试过输出缓冲;两者似乎都不起作用。猜猜看?或者这是我在JQuery中需要做的事情

<?php
echo(“我们会尽快给您发送电子邮件。”);
标题(“连接:关闭”);
//做一些需要一段时间的事情
邮件('[email protected]“好了,我做完了”,“是的,都做完了。”);
?>

以下PHP手册页面(包括用户注释)提供了有关如何在不结束PHP脚本的情况下关闭与浏览器的TCP连接的多条说明:

  • 连接处理文档

据推测,它需要的不仅仅是发送一个关闭的头


OP随后确认:是的,这就成功了:指向用户注释71172(2006年11月)复制到这里:

自[php]4.1以来,在保持php脚本运行的同时关闭用户浏览器连接一直是一个问题,当时register\u shutdown\u function()的行为被修改为不会自动关闭用户连接

sts在mail dot xubion dot hu发布了原始解决方案:

<?php
标题(“连接:关闭”);
ob_start();
phpinfo();
$size=ob_get_length();
标题(“内容长度:$size”);
ob_end_flush();
冲洗();
睡眠(13);
错误日志(“在后台做某事”);
?>

在将echo('text I want user see')替换为phpinfo()之前,这一切都很正常在这种情况下,不会发送标题

解决方案是在发送头信息之前显式关闭输出缓冲并清除缓冲区。例如:

<?php
ob_end_clean();
标题(“连接:关闭”);
忽略用户中止(真);//为了安全起见
ob_start();
echo(“用户将看到的文本”);
$size=ob_get_length();
标题(“内容长度:$size”);
ob_end_flush();//奇怪的行为,是行不通的
flush();//除非两者都叫!
//在这里处理吗
睡眠(30);
echo(“文本用户将永远看不到”);
?>

我花了3个小时想弄明白这一点,希望它能帮助别人:)

测试地点:

  • IE 7.5730.11
  • Mozilla Firefox 1.81

2010年7月晚些时候,在一个相关的回答中,北极大火将另外两个用户注释链接到上面的注释:

  • 连接处理用户说明#89177(2009年2月)
  • 连接处理用户说明#93441(2009年9月)

发表评论