为了账号安全,请及时绑定邮箱和手机立即绑定

提前关闭连接

提前关闭连接

MMTTMM 2019-06-25 14:45:58
提前关闭连接我正在尝试执行一个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.' );?>
查看完整描述

3 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

以下PHP手册页(包括。(用户注释)建议关于如何在不终止PHP脚本的情况下关闭到浏览器的TCP连接的多条指令:

据推测,它需要的不仅仅是发送一个封闭的标题。


执行部分随后确认:是的,这招成功了: 指向用户注71172(2006年11月)在此复制:

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

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 safeob_start();echo('Text the user will see');
$size = ob_get_length();header("Content-Length: $size");ob_end_flush(); // Strange behaviour, will not workflush();
 // Unless both are called !// Do processing here sleep(30);echo('Text user will never see');?>

我只是花了3个小时试图弄清楚这个问题,希望它能帮到某人:)

测试:

  • IE 7.5730.11
  • Mozilla Firefox 1.81



    查看完整回答
    反对 回复 2019-06-25
    ?
    慕桂英3389331

    TA贡献2036条经验 获得超8个赞

    有必要发送以下两个标题:

    Connection: closeContent-Length: n (n = size of output in bytes )

    由于需要知道输出的大小,所以需要缓冲输出,然后将其刷新到浏览器:

    // buffer all upcoming outputob_start();echo "We'll email you as soon as this is done.";// get the size of the output$size = ob_get_length();
    // send headers to tell the browser to close the connectionheader("Content-Length: $size");header('Connection: close');
    // flush all outputob_end_flush();ob_flush();flush();
    // if you're using sessions, this prevents subsequent requests
    // from hanging while the background process executesif (session_id()) session_write_close();
    /******** background process starts here ********/

    另外,如果您的Web服务器正在对输出使用自动gzip压缩(即。),这将无法工作,因为输出的实际大小发生了变化,并且内容长度不再准确。禁用gzip压缩特定脚本。

    欲知更多详情,请访问http:/www.zulius.com/How-to/关门浏览器-连接-继续-执行


    查看完整回答
    反对 回复 2019-06-25
    • 3 回答
    • 0 关注
    • 625 浏览

    添加回答

    举报

    0/150
    提交
    取消
    意见反馈 帮助中心 APP下载
    官方微信