2014-03-27 50 views
0

假设用户将表单提交给submit.php,服务器将返回两个可能的响应:A或B.如果服务器要返回B,那么我想服务器发送电子邮件到一个地址。在PHP脚本结束之前PHP向用户返回输出

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

的问题是,它往往需要一些时间来等待邮件()来完成...该用户只能得到响应的服务器完成邮件后()。这对我的用户来说是一个非常糟糕的体验。

有什么办法,服务器可以立即返回响应'B'给用户,然后它发送邮件?

+0

可我问为什么邮件的时间太长?也许你需要优化你的邮件代码而不是 – andrew

+2

把邮件发送到一个队列中并让一个cron作业接收并实际发送邮件。 – GordonM

+0

@andrew有时邮件正在等待处理,我不知道是什么原因,因为我没有自己的邮件服务器... – ChandlerQ

回答

3

看看在flush()功能

刷新PHP程序的写缓冲器,无论后端PHP使用(CGI,web服务器等)。这会尝试将电流输出一路推送到浏览器,并提出一些注意事项。 flush()可能无法覆盖Web服务器的缓冲方案,并且它对浏览器中的任何客户端缓冲都没有影响。它也不影响PHP的用户空间输出缓冲机制。这意味着如果使用这些缓冲区,则必须调用ob_flush()和flush()来刷新ob输出缓冲区。

2

您可以使用任务排队的平台来执行异步任务,它不应该这么复杂设置,像ActiveMQ

2

更改代码如下:

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

然而,应该注意许多事情可以防止这种情况发生(如从flush()文档引用的那样):

几台服务器,特别是在Win32中,仍然会缓存脚本的输出,直到它的结果发送到浏览器之前终止。为Apache

服务器模块,比如mod_gzip,可能自己的缓冲,这将导致flush()不导致被立即发送到客户端的数据。

即使浏览器可能会在显示它之前缓冲其输入。例如Netscape浏览器,文本缓冲器,直到它接收到一个端部的行或标签的开始,并且直到最外层表的</table>标签看出它不会呈现表。

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

+0

其实我已经试过这个,但它不会为我工作... – ChandlerQ

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()创建一种称为欲望的“功能” d函数与静态参数。

更多create_function()