我在Zend Framework应用程序中使用Zend_Mail发送包含基于Web的联系表单内容的电子邮件。
邮件本身运行良好(即时使用Google Apps帐户),但处理时间可能相当长(从几秒钟到近一分钟)。
我的控制器操作通常会在发送邮件后重定向访问者,所以我想我可以在调用$ mail-&gt; send()之前重定向访问者并让脚本继续在'后台'中:< / p>
所以我尝试了以下内容:
$mailView = clone $this->view;
$mailView->assign('name', $form->getValue('name'));
$mailView->assign('email', $form->getValue('email'));
$mailView->assign('message', $form->getValue('message'));
$mailContent = $mailView->render('mailContact.phtml');
$mail = new Zend_Mail();
$mail->addTo('recipient@domain.com');
$mail->setSubject('Web Contact');
$mail->setBodyHtml($mailContent, 'UTF-8');
$this->_flashMessenger->addMessage('Thank you for your message!');
$this->_redirector->setExit(false)->gotoUrl('/about/contact');
$mail->send();
其中$this->_redirector
是* Zend_Controller_Action_Helper_Redirector *的实例
这似乎没有什么区别,在发送邮件之后,脚本仍然被阻止,之后发生了重定向。
也许我应该编写一个Controller插件,使用postDispatch()钩子允许我在重定向访问者后发送邮件?
欢迎提出建议!
答案 0 :(得分:4)
由于PHP不支持多线程编程,因此唯一想到的是执行处理邮件发送的不同程序。 如果您可以控制主机,则可以以非阻塞方式使用exec()。 检查此帖子 - http://www.phpbuilder.com/board/showthread.php?t=10351142了解如何操作
答案 1 :(得分:3)
我想建议使用cron作业,它相对容易,稳定,而且非常适合你
这里有一些关于ZF + cronjobs的链接:
经过一些研究和拖延之后,我得出了一个简单的结论:一个ZF化的cron脚本应该包含你所有的zend框架应用程序的功能 - 没有所有的查看内容。我通过在我的应用程序目录中创建一个新的cronjobfoo.php文件来完成此操作。然后我从以下方面采取了最低限度:-my前端控制器(index.php)-my bootstrap.php我拿出了所有的观点和内容 专注于保持环境 设置,数据库设置,自动加载器,&amp; 注册表设置。我不得不采取一点 是时候纠正文档根目录了 变量并删除一些OO 功能从我的复制 自举。
之后,我只是编码了...在我的 它正在编译并通过电子邮件发送出去 每晚报道。这很棒 Zend_Mail中去。当我有信心的时候 我的剧本就像我一样 我想把它添加到我的crontab中。
Goodluck!
答案 2 :(得分:1)
你为什么不试试这个:
答案 3 :(得分:0)
默认情况下,PHP不允许多线程。完成工作的一些方法:
使用一些消息队列服务,如IronMQ [推荐方法],它会对您的系统进行安全的API / cURL调用,并产生一个单独的进程,不会阻塞执行。
在PHP中使用输出缓冲并在最终启动邮件发送操作之前使用ob_flush。
在上一次操作成功后,让客户端再次通过AJAX调用服务器。
在服务器上安装pthreads PECL扩展程序