【发布时间】:2015-05-06 10:41:28
【问题描述】:
我有一个应用程序,可以在其中根据从客户端检索到的数据创建/生成 PDF。生成 PDF 后,我将这些 PDF 发送到所需的电子邮件并创建下载按钮,以便客户也可以下载该文件。 问题是发送邮件需要大约 10-15 秒,甚至更多,然后才能创建下载按钮。 有没有办法可以将电子邮件发送过程置于后台,这样我就可以直接跳到代码的下载部分,而不是等待邮件程序完成所有操作。
$name = md5(time());
$pdfoutput = $in->_config["path"] . '/PDFs/' . $name . '.pdf';
$mpdf->Output( $pdfoutput,'F' );
$subject = "Offer";
$body["html"] = "<b>Offer in html</b>";
$body["text"] = "Offer as text";
$files = array($pdfoutput);
$addresses = array("*******@hotmail.com");
// PROBLEMATIC PART
$mail->createEmails($addresses, $subject, $body, $files); // i want this proces to go in background
$pdfurl = $in->_config["url"] . "PDFs/" . $name . ".pdf";
return json_encode(array("status" => "ok", "reason" => "PDF CREATED!", "pdffile" => $pdfurl));
【问题讨论】:
-
也许你应该看看 pcntl_fork:php.net/manual/en/function.pcntl-fork.php
-
考虑将电子邮件任务提交到作业队列,而不是尝试作为请求的一部分运行
-
@MarkBaker:您的意思是创建队列,然后,例如,使用系统的 CRON,每分钟检查是否有新电子邮件要发送?或者以后如何执行队列?
-
有很多严肃的排队系统可供选择:rabbitmq、zeromq、gearman 等......但在最简单的层面上,将详细信息写入文件/数据库,然后有一个cron 任务查找该文件/数据库记录,如果存在则读取详细信息,发送电子邮件,然后删除文件/数据库记录是创建后台任务的一种非常简单的方法
-
对不起,排队系统很好,但分叉进程应该在实施后几分钟内解决问题。实施排队系统需要更多时间。
标签: php pdf phpmailer delayed-execution