2011-01-26 66 views
2

我在Zend Framework应用程序中使用Zend_Mail发送包含基于Web的联系人窗体内容的电子邮件。发送邮件时不会阻止'执行'

邮件本身工作正常(即使用Google Apps帐户),但处理时间可能相当长(从几秒到几分钟)。

我的控制器操作通常会在发送邮件后重定向访问者,所以我想我可能会在调用$ mail-> send()之前重定向访问者,并让脚本在“后台”继续:

所以我试过如下:

$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('[email protected]'); 
$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 *

这似乎并不有所作为,脚本仍然受阻,而邮件是一个实例SE nt之后,发生重定向。

也许我应该写一个控制器插件,使用postDispatch()钩子允许我在访问者重定向后发送邮件?

欢迎提出建议!

回答

1

你为什么不试试这个:

  1. 加载视图
  2. 调用一个Ajax脚本 从视图中,可以加载 负责 发送电子邮件控制器。
+0

上安装并行线程PECL扩展,如果90%的用户允许的Ajax/JavaScript,然后90的电子邮件%将被发送。这不是该任务的最佳机制。 – 2011-01-26 20:36:30

3

我想建议使用cron作业,其相对简单,稳定,只是适合你

这里大约ZF + cronjobs一些链接:

  1. How do you store your scripts for cron jobs in Zend Framework?
  2. http://www.god-object.com/2010/03/26/bootstrap-zend-framework-for-use-in-cronjobs/
  3. http://jazzslider.org/2010/01/12/cron-tasks-in-zend-framework-apps
  4. Create cronjob with Zend Framework >>

一些研究,我来到了一个简单的结论,一个ZF-美化版的cron脚本应该包含你所有的功能很多拖延后Zend Framework的应用程序 - 没有所有的观点的东西。我通过在我的应用程序目录中创建一个新的cronjobfoo.php文件来完成此任务。然后,我从最低限度获取: - 我的前端控制器(index.php) - 我的引导程序。PHP

我拿出全部集中在保持环境 设置,DB设置,自动加载机,& 注册表设置视图东西, 。我不得不采取一些 时间来更正文档根目录 变量并删除从我的 bootstrap复制的一些OO 功能。

之后,我刚刚编码了..在我的 的情况下,它编译并通过电子邮件发送出 夜间报告。使用 Zend_Mail非常好。当我确信 我的脚本按照我想要的方式工作时,我只是将它添加到了我的crontab中。

Goodluck!

0

默认情况下,PHP不允许多线程。一些方式来完成您的工作:

  1. 使用像IronMQ [推荐的方法]一些消息队列服务,能够使安全API /卷曲呼叫您的系统,并产生过一个单独的进程W/O阻塞执行。

  2. 在PHP中使用输出缓冲并在最终启动邮件发送操作之前使用ob_flush。

  3. 在先前的操作成功时,让客户端通过AJAX再次调用服务器。

  4. 服务器

相关问题