猿问

提前关闭连接

提前关闭连接

我正在尝试执行一个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 whilemail( 'dude@thatplace.com', "okay I'm done", 'Yup, all done.' );?>


MMTTMM
浏览 626回答 3
3回答

拉莫斯之舞

以下PHP手册页(包括。(用户注释)建议关于如何在不终止PHP脚本的情况下关闭到浏览器的TCP连接的多条指令:连接处理博士据推测,它需要的不仅仅是发送一个封闭的标题。执行部分随后确认:是的,这招成功了:&nbsp;指向用户注71172(2006年11月)在此复制:关闭用户浏览器连接,同时保持php脚本运行一直是自[PHP]4.1以来的一个问题。register_shutdown_function()被修改,使其不会自动关闭用户连接。STS在邮件中发布了最初的解决方案:<?php header("Connection:&nbsp;close");ob_start();phpinfo();$size&nbsp;=&nbsp;ob_get_length();header("Content-Length:&nbsp;$size");ob_end_flush(); flush();sleep(13);error_log("do&nbsp;something&nbsp;in&nbsp;the&nbsp;background");?>它可以正常工作直到你替换掉phpinfo()为echo('text I want user to see');在这种情况下,头永远不会被发送!解决方案是在发送头信息之前显式关闭输出缓冲区并清除缓冲区。例子:<?php ob_end_clean();header("Connection:&nbsp;close");ignore_user_abort(true);&nbsp;//&nbsp;just&nbsp;to&nbsp;be&nbsp;safeob_start();echo('Text&nbsp;the&nbsp;user&nbsp;will&nbsp;see'); $size&nbsp;=&nbsp;ob_get_length();header("Content-Length:&nbsp;$size");ob_end_flush();&nbsp;//&nbsp;Strange&nbsp;behaviour,&nbsp;will&nbsp;not&nbsp;workflush(); &nbsp;//&nbsp;Unless&nbsp;both&nbsp;are&nbsp;called&nbsp;!//&nbsp;Do&nbsp;processing&nbsp;here&nbsp;sleep(30);echo('Text&nbsp;user&nbsp;will&nbsp;never&nbsp;see');?>我只是花了3个小时试图弄清楚这个问题,希望它能帮到某人:)测试:IE 7.5730.11Mozilla Firefox 1.81

慕桂英3389331

有必要发送以下两个标题:Connection:&nbsp;closeContent-Length:&nbsp;n&nbsp;(n&nbsp;=&nbsp;size&nbsp;of&nbsp;output&nbsp;in&nbsp;bytes&nbsp;)由于需要知道输出的大小,所以需要缓冲输出,然后将其刷新到浏览器://&nbsp;buffer&nbsp;all&nbsp;upcoming&nbsp;outputob_start();echo&nbsp;"We'll&nbsp;email&nbsp;you&nbsp;as&nbsp;soon&nbsp;as&nbsp;this&nbsp;is&nbsp;done.";//&nbsp;get&nbsp;the&nbsp;size&nbsp;of&nbsp;the&nbsp;output$size&nbsp;=&nbsp;ob_get_length(); //&nbsp;send&nbsp;headers&nbsp;to&nbsp;tell&nbsp;the&nbsp;browser&nbsp;to&nbsp;close&nbsp;the&nbsp;connectionheader("Content-Length:&nbsp;$size");header('Connection:&nbsp;close'); //&nbsp;flush&nbsp;all&nbsp;outputob_end_flush();ob_flush();flush(); //&nbsp;if&nbsp;you're&nbsp;using&nbsp;sessions,&nbsp;this&nbsp;prevents&nbsp;subsequent&nbsp;requests //&nbsp;from&nbsp;hanging&nbsp;while&nbsp;the&nbsp;background&nbsp;process&nbsp;executesif&nbsp;(session_id())&nbsp;session_write_close(); /********&nbsp;background&nbsp;process&nbsp;starts&nbsp;here&nbsp;********/另外,如果您的Web服务器正在对输出使用自动gzip压缩(即。),这将无法工作,因为输出的实际大小发生了变化,并且内容长度不再准确。禁用gzip压缩特定脚本。欲知更多详情,请访问http:/www.zulius.com/How-to/关门浏览器-连接-继续-执行
随时随地看视频慕课网APP
我要回答