【问题标题】:Continue script execution without waiting for return in php继续执行脚本,无需等待 php 中的返回
【发布时间】: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


【解决方案1】:
PHP Fatal error: Call to undefined function pcntl_fork() 

这只是意味着您尚未安装/启用 pcntl 扩展。实际上,我建议不要使用 apache SAPI 中的 pcntl - 您可以使用 shell_exec 从 apache SAPI 生成一个没有 pcntl 分叉的 PHP 实例,并且有一些很好的包装器可以帮助解决这个问题,例如 cocur

通过数据库排队可以正常工作,如果您已经在使用数据库,则非常容易。否则我建议beanstalkdpheanstalk 与它交谈。然后从 cron 或作为守护进程运行发送进程。

【讨论】:

    【解决方案2】:

    你为什么不把它移下来输出你的json呢?也刷新你的缓冲区。

    http://php.net/manual/en/function.ignore-user-abort.php

    【讨论】:

      猜你喜欢
      • 2017-11-05
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      相关资源
      最近更新 更多