PHP mail()函数延迟问题

3

我有一个小的订单应用程序,它通过ajax将订单提交给PHP脚本。PHP脚本接收到订单后,将其放入数据库中,向客户端发送“OK”消息,然后再向客户和我发送确认电子邮件。问题是客户端大约需要15秒钟才能看到“OK”(这会更新浏览器显示)。如果我注释掉电子邮件发送,就不会有延迟。

... write to database
echo "OK";
mail($semail,'Msg Subject',$message, $header, $bounceto);
mail($semail2,'Msg Subject',$mesage, $header, $bounceto);

这条消息只有几行。

问题:

  • 为什么调用mail()函数时会有延迟?
  • 我该如何让“OK”消息在PHP脚本完成之前发送?我猜测需要进行某种刷新。
2个回答

3
这是因为http://php.net/manual/en/function.mail.php返回成功或失败的布尔值,而您的邮件服务器需要时间处理电子邮件请求。您可以实现一种MYSQL电子邮件队列,在其中放置待发送的邮件,并使用后台任务(例如使用CRON)检查它,以启动YourMailQueueProcessingScripts.php,它将检查是否有邮件要发送,并执行发送操作 - 请注意,您最多可以每分钟运行CRON一次,我不知道1分钟延迟发送电子邮件是否可接受。

感谢提供信息和建议。一分钟的延迟可能是可以接受的。如果我能够将缓冲区刷新到客户端,然后让PHP继续处理可能会更好? - David G
1
它应该与http://php.net/manual/en/function.fastcgi-finish-request.php一起工作,但需要https://php-fpm.org/。 - Mark
还有http://php.net/register_shutdown_function,您可以在其中放置邮件功能。但我认为它们是hack而不是适当的解决方案。电子邮件从来都不是即时的,所以我仍然会选择队列。 - Mark
我说得太早了。看起来fastcgi_finish_request解决了这个问题,但实际上它是以错误终止了PHP脚本,因为PHP-FPM没有加载(你确实标记了这一点)。这是一个虚拟主机环境,所以我不确定我能否(或者是否想要)加载PHP-FPM。 - David G

0

它应该与fastcgi-finish-request.php一起工作,但需要PHP FPM

添加此内容将把缓冲区输出到用户并切断连接,脚本的其余部分仍将被执行,但不会发送其他输出,因此请确保在调用fastcgi_finish_request()mail()函数之前输出所有内容。


1
谢谢。我已经实现了MySQL电子邮件队列功能。 - David G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接