PHP等待创建PDF,然后通过邮件发送


PHP Wait for PDF to be created and then send it in a mail?

我写了这个脚本,它向客户发送订单收据,但它有一个问题:

它不会等待PDF脚本

因此,它只需要PDF脚本,并在PDF脚本仍在处理PDF时开始执行它并发送邮件。我确信有一种方法可以延迟电子邮件脚本,但会使事情变得更复杂:

整个order.php通过jquery ajax调用执行,脚本将等待php完成,然后报告浏览器请求成功。因此,当客户想知道为什么要花这么长时间时,它可能会等待五分钟以上

所以我需要它等待PDF创建,然后发送邮件,但它不应该让客户端等待。

这是我的代码:

<?php 
    $addid = "orderid.txt";
    $current = file_get_contents($addid) + 1;
    echo $current;
    file_put_contents($addid, $current);
?>
<?php
// Lue tilauksen ID sähköpostia varten
$orderid = "orderid.txt";
$ordernumber = file_get_contents($orderid);
// Kirjoita kuitti
require('receipt.php');
?>
<?php   
//Lähetä tilausvahvistus
require_once('mail/class.phpmailer.php');
$path = "kuitit/kuitti".$orderid.".pdf";
$bodytext = '
Olemme vastaanottaneet tilauksenne '. $ordernumber .'. 
Tilaamanne tuotteet löytyvät liitteestä.'
  ;
$email = new PHPMailer();
$email->From      = 'no-reply@coverlinefilms.fi';
$email->FromName  = 'no-reply@coverlinefilms.fi';
$email->Subject   = 'Olemme vastaanottaneet tilauksenne ' . $ordernumber;
$email->Body      = $bodytext;
$email->AddAddress('christian.nikkanen@gmail.com');
$email->AddAttachment($path, 'kuitti777.pdf');
return $email->Send();
?>

PDF脚本

在您的情况下(以及在大多数CPU密集型活动中),我通常使用带有两个cronjobs的队列:第一个将生成pdf文件,并在数据库表中将它们标记为就绪。第二个cronjob将查询数据库,检查pdf是否处于"就绪"状态,然后发送带有附件的电子邮件。

这样做,在最好的情况下,你会有一个空队列:所有收据都会在准备好后立即发送,在最坏的情况下系统会增加发送所有电子邮件的速度,直到PDF队列为空。

希望这种方法是明确的。您可以在这里找到一些关于PHP守护进程的参考(IMHO是比普通PHP脚本更好的管理作业的方法)。