发送邮件而不阻止“执行”

时间:2011-01-26 17:06:57

标签: php zend-framework zend-mail

我在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()钩子允许我在重定向访问者后发送邮件?

欢迎提出建议!

4 个答案:

答案 0 :(得分:4)

由于PHP不支持多线程编程,因此唯一想到的是执行处理邮件发送的不同程序。 如果您可以控制主机,则可以以非阻塞方式使用exec()。 检查此帖子 - http://www.phpbuilder.com/board/showthread.php?t=10351142了解如何操作

答案 1 :(得分: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&gt;&gt;
  5.   经过一些研究和拖延之后,我得出了一个简单的结论:一个ZF化的cron脚本应该包含你所有的zend框架应用程序的功能 - 没有所有的查看内容。我通过在我的应用程序目录中创建一个新的cronjobfoo.php文件来完成此操作。然后我从以下方面采取了最低限度:-my前端控制器(index.php)-my bootstrap.php

         

    我拿出了所有的观点和内容   专注于保持环境   设置,数据库设置,自动加载器,&amp;   注册表设置。我不得不采取一点   是时候纠正文档根目录了   变量并删除一些OO   功能从我的复制   自举。

         

    之后,我只是编码了...在我的   它正在编译并通过电子邮件发送出去   每晚报道。这很棒   Zend_Mail中去。当我有信心的时候   我的剧本就像我一样   我想把它添加到我的crontab中。

    Goodluck!

答案 2 :(得分:1)

你为什么不试试这个:

  1. 加载视图
  2. 调用Ajax脚本 从将加载的视图内 控制器负责 发送电子邮件。

答案 3 :(得分:0)

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

  1. 使用一些消息队列服务,如IronMQ [推荐方法],它会对您的系统进行安全的API / cURL调用,并产生一个单独的进程,不会阻塞执行。

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

  3. 在上一次操作成功后,让客户端再次通过AJAX调用服务器。

  4. 在服务器上安装pthreads PECL扩展程序