当前位置: 首页 > 面试题库 >

如何提早关闭连接?

顾俊誉
2023-03-14
问题内容

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

我已经尝试过使用“关闭”标头(如下),以及输出缓冲了。似乎都不起作用。有什么猜想吗?还是我需要在JQuery中做这件事?

<?php

echo( "We'll email you as soon as this is done." );

header( "Connection: Close" );

// do some stuff that will take a while

mail( 'dude@thatplace.com', "okay I'm done", 'Yup, all done.' );

?>

问题答案:

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

  • 连接处理 文档

据说它比发送关闭标头还需要更多。

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

自[PHP]
4.1起,在保持php脚本运行的同时关闭用户浏览器连接一直是一个问题,当时该行为已register_shutdown_function()被修改为不会自动关闭用户连接。

邮件点xubion点hu的sts发表了原始解决方案:

<?php
header("Connection: close");
ob_start();
phpinfo();
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();
sleep(13);
error_log("do something in the background");
?>

其中,直到你代替工作正常phpinfo()进行echo('text I want user to see');在这种情况下,头永远不会发送!

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

<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true); // just to be safe
ob_start();
echo('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush(); // Strange behaviour, will not work
flush(); // Unless both are called !
// Do processing here
sleep(30);
echo('Text user will never see');
?>

仅仅花了3个小时试图弄清楚这个问题,希望对您有所帮助:)

经过测试:

  • IE 7.5730.11
  • Mozilla Firefox 1.81

随后,在2010年7月, Arctic Fire 在一个相关的答案中,
将以上两个后续的用户注释链接到了上面的一个: __

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


 类似资料:
  • 问题内容: 我正在使用长轮询的客户端实现: 是否有一种标准方法可以从客户端抢占/取消请求? 我想调用会做到这一点,但是我不得不从另一个goroutine调用它,因为通常在读取长轮询的响应时,客户端通常已经被阻塞。 我知道有一种方法可以通过设置超时,但是我的应用逻辑需要根据用户操作(而不只是超时)进行取消。 问题答案: 不,client.Post是90%不需要取消请求的用例的便捷包装。 重新实现您的

  • null 请参见REST API服务器的代码 REST客户端的代码 我从我的Spring Boot Main方法调用这个类为

  • 我编写了以下代码来连接到Oracle数据库。这用于REST API。我正在连接的数据库的IDLE_TIME参数设置为30分钟(这不能更改)。如果数据库连接空闲超过30分钟,则会抛出以下错误:“java.sql.SQLRecoverableException: ClosedConnection”。抛出此错误后,API将停止工作。我如何解决这个问题?

  • 我使用weblogic应用服务器和oracle数据库。我使用jdbc与oracle数据库通信。我从weblogic数据源获得连接,并向表中插入一条记录。问题是,当我想关闭连接(插入数据库后)时,我会遇到一个异常(连接已经关闭)。这是我的代码: 但是联系。close语句引发异常: 我试图避免连接。close语句(因为我教过连接是自动关闭的!!但过了一段时间,所有的连接都打开了,因此引发了一个异常)

  • 问题内容: 这是我要运行的示例代码: 有没有一种方法可以运行此方法而又不会从MySQL收到“ Too many connections”错误?我已经知道我可以以其他方式处理连接或拥有连接池。我只想了解如何正确关闭sqlalchemy的连接。提前致谢! 问题答案: 这是正确编写该代码的方法: 也就是说,是连接 工厂 和连接 池 ,而不是连接本身。当您说时,连接将 返回到Engine内的连接池 ,而实

  • 问题内容: 我试图了解哪些是应用程序的“物理”限制。 在客户端: 在服务器端: 在OSX中达到文件限制(256)时,统计信息如下 让我感到困惑的是: 如果我强行关闭连接(这是我想对客户端执行的操作,为什么我仍在使用文件句柄(因此达到文件限制),请执行以下操作:编辑:添加延迟似乎使服务器可以保持呼吸并且永远不会达到文件限制)? 有没有一种方法可以完全关闭套接字,以便可以确定很少达到文件限制(我知道可