我有一个访问MySQL数据库然后发送电子邮件的表单。
访问数据库的速度很快,但相比较而言,执行电子邮件过程的速度很慢,这会导致用户在等待mail()
完成时认为网页已挂起的问题。
在没有进入控制用户行为的对话中,是否可以在PHP中创建一个线程或回调,以便我可以将邮件例程发送到后台,以便页面的正常操作可以继续?净网,我不想等待整个过程完成并停止页面,但我愿意开始并稍后查看结果,甚至点击忘记它。
是的,有使用JS的替代品,但我想先看看选项。
以下是一些警告:
1.我没有shell访问权限
2.它在没有远程功能的Windows服务器上运行
3.我只能在本地机器上创建页面并通过ftp上传(即Godaddy)
答案 0 :(得分:1)
This blog post建议将mail
方法的其他投放模式参数设置为Background
,而不是默认Interactive
。这可能就是你要找的东西。
mail($to, $subject, $message, $headers, 'O DeliveryMode=b')
答案 1 :(得分:0)
PHP中没有线程,我怀疑它会有什么。您可以在某种程度上使用流程模拟它,但在您的情况下,这是不可能的。您的问题可以通过消息队列作为典型的生产者/消费者问题来解决。创建一个DB表来存储要发送的消息队列,并有2个脚本 - 首先将消息添加到DB中。第二个进程负责从该DB表中获取这些消息,将其发送并删除。
您可以简单地使用一个文件夹,每个电子邮件由一个文件代表,该文件具有一些基于microtime()调用的唯一名称。
答案 2 :(得分:0)
您可以使用session_write_close()
提前结束连接。之后,您可以执行耗时的任务,而无需用户注意到“页面正在加载”。请注意,除非您更改,否则页面的最长执行时间仍然存在。有关详细信息,请参阅this documentation。
echo 'Hello StackOverflow';
session_write_close();
mail( $to, $subject, $message, $headers );
while( TRUE ) { }