0

我有一个访问 MySQL 数据库然后发送电子邮件的表单。

访问数据库很快,但相比之下,执行电子邮件过程却很慢,这会导致用户认为网页在等待mail()完成时挂起的问题。

在不讨论控制用户行为的情况下,是否可以在 PHP 中创建一个线程或回调,允许我将邮件例程发送到后台,以便页面的正常操作可以继续?Net net,我不想等待进程完成并停止页面,但我愿意启动它并稍后检查它的结果,甚至点击并忘记它。

是的,使用 JS 有替代方案,但我想先看看选项。

这里有一些注意事项:
1. 我没有 shell 访问权限。
2. 这在没有远程功能的 Windows 服务器上运行。
3.我只能在本地机器上创建页面并通过ftp上传(即Godaddy)

4

3 回答 3

1

这篇博文建议将mail方法的附加交付模式参数设置为Background而不是默认值Interactive。这可能是您正在寻找的。

mail($to, $subject, $message, $headers, 'O DeliveryMode=b')
于 2013-08-18T17:54:00.943 回答
0

PHP 中没有线程,我怀疑永远不会有。您可以在某种程度上使用流程模拟它,但在您的情况下这是不可能的。您的问题可以通过消息队列作为典型的生产者/消费者问题来解决。创建一个数据库表来存储要发送的消息队列并有 2 个脚本 - 首先将消息添加到数据库中。第二个进程负责从该数据库表中获取这些消息,将其发送出去并删除它。

而不是 DB,您可以简单地使用一个文件夹,其中每封电子邮件由一个文件表示,该文件具有基于 microtime() 调用的一些唯一名称。

于 2013-08-18T17:57:30.693 回答
0

您可以使用 提前结束连接session_write_close()。之后,您可以执行一项耗时的任务,而用户不会注意到“页面正在加载”。请注意,除非您更改,否则页面的最大执行时间仍然存在。有关详细信息,请参阅此文档

echo 'Hello StackOverflow';

session_write_close();

mail( $to, $subject, $message, $headers );

while( TRUE ) { }
于 2013-08-18T18:04:56.700 回答