PHP在PHP脚本结束之前将输出返回给用户

时间:2014-03-27 09:05:22

标签: php asynchronous echo sendmail

假设用户提交表单到submit.php,服务器将返回两个可能的响应:A或B.如果服务器要返回B,那么我喜欢服务器发送电子邮件到地址。

<?php
     if(B){
          echo 'B';
     }
     mail($to, $subj, $msg);
?>

问题是等待mail()完成通常需要一些时间......用户只能在服务器完成mail()后获得响应。这对我的用户来说是一次非常糟糕的体验。

服务器是否有任何方式可以返回响应&#39; B&#39;立即给用户,然后发送邮件?

4 个答案:

答案 0 :(得分:3)

查看 flush() 功能

  

刷新PHP的写缓冲区以及PHP正在使用的任何后端(CGI,Web服务器等)。这会尝试将当前输出一直推送到浏览器,但需要注意几点。   flush()可能无法覆盖Web服务器的缓冲方案,并且它对浏览器中的任何客户端缓冲没有影响。它也不会影响PHP的用户空间输出缓冲机制。这意味着如果使用ob输出缓冲区,则必须同时调用ob_flush()和flush()来刷新ob输出缓冲区。

答案 1 :(得分:2)

您可以使用任务排队平台来执行异步任务,设置起来不会那么复杂,例如ActiveMQ

答案 2 :(得分:2)

将代码更改为以下内容:

if (B) {
    echo 'B';
    flush();
    ob_flush();
}

但是,应该注意的是,很多事情可能会阻止它工作(引自flush()文档):

  

多个服务器,尤其是Win32上的服务器,仍将缓冲脚本的输出,直到它终止,然后才将结果传输到浏览器。

     

像mod_gzip这样的Apache服务器模块可能会自行缓冲,导致flush()不会导致数据立即发送到客户端。

     

即使是浏览器也可以在显示之前缓冲其输入。例如,Netscape缓冲文本,直到它收到行尾或标记的开头,并且在看到最外层表的</table>标记之前它不会呈现表。

     

某些版本的Microsoft Internet Explorer只会在收到256字节的输出后才开始显示页面,因此您可能需要在刷新之前发送额外的空格以使这些浏览器显示该页面。

答案 3 :(得分:0)

使用此PHP功能register_shutdown_function

<?php
  if(B){
    echo 'B';
  }
  $m = "mail($to, $subj, $msg);";
  register_shutdown_function(create_function('',$m));
?> 

register_shutdown_function:在关机时注册执行功能

  

诀窍是使用 create_function()来创建&#34;功能&#34;用静态参数调用所需的函数。

更多关于create_function()