2013-08-18 17 views
0

我有一个表单访问MySQL数据库,然后发送一封电子邮件。PHP回调过程

访问数据库很快,但是做电子邮件的过程比较慢,这导致用户认为网页被挂起而等待mail()完成。

如果不进行控制用户行为的对话,是否可以在PHP中创建一个线程或回调函数,以允许我将邮件例程发送到后台,以便页面的正常运行可以继续?网络净额,我不想等到这个过程完成并拖延页面,但我愿意将它启动并稍后检查其结果,甚至点击并忘记它。

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

以下是一些注意事项:
1.我没有shell访问权限。
2.它运行在没有远程功能的Windows服务器上。
3.我只能创建我的本地计算机上的网页,并通过FTP上传(即Godaddy的)

+0

你真的在找[Threads](http://php.net/manual/en/class.thread.php)吗? – Itay

+0

类似主题:http://stackoverflow.com/questions/138374/close-a-connection-early – Sumurai8

回答

1

This blog post暗示mail方法的额外交付模式参数设置为Background,而不是默认Interactive。这可能是你正在寻找的。

mail($to, $subject, $message, $headers, 'O DeliveryMode=b') 
0

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

代替数据库,您可以简单地使用一个文件夹,每个电子邮件由具有基于microtime()调用的某个唯一名称的文件表示。

0

您可以尽早结束连接session_write_close()。之后,您可以在没有用户注意到“该页面正在加载”的情况下执行耗时的任务。请注意,除非您更改,否则页面的最大执行时间仍然存在。有关更多信息,请参阅this documentation

echo 'Hello StackOverflow'; 

session_write_close(); 

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

while(TRUE) { }