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('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* 的实例在哪里

这似乎没有什么区别,在发送邮件时脚本仍然被阻止,之后发生重定向。

也许我应该编写一个控制器插件,使用 postDispatch() 挂钩是否允许我在访客被重定向后发送邮件?

欢迎提出建议!

4

4 回答 4

4

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

于 2011-01-26T17:51:11.900 回答
3

我建议使用 cron 作业,它相对简单、稳定,而且很适合你。

这里有一些关于 ZF + cronjobs 的链接:

  1. 如何在 Zend 框架中存储 cron 作业的脚本?
  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. 使用 Zend 框架创建 cronjob >>

经过一些研究和大量拖延后,我得出了一个简单的结论,即 ZF 化的 cron 脚本应该包含您 zend 框架应用程序的所有功能 - 没有所有视图的东西。我通过在我的应用程序目录中创建一个新的 cronjobfoo.php 文件来实现这一点。然后我从以下方面获取了最低限度: -my front controller (index.php) -my bootstrap.php

我拿出了所有的视图材料,专注于保持环境设置、数据库设置、自动加载器和注册表设置。我不得不花一点时间来更正文档根变量并删除从我的引导程序中复制的一些 OO 功能。

在那之后我只是编码了......在我的情况下,它正在编译并通过电子邮件发送夜间报告。使用 Zend_Mail 很棒。当我确信我的脚本按我想要的方式运行时,我只是将它添加到我的 crontab 中。

祝你好运 !

于 2011-01-26T21:04:19.590 回答
1

你为什么不试试这个:

  1. 加载视图
  2. 从将加载负责发送电子邮件的控制器的视图中调用 Ajax 脚本。
于 2011-01-26T17:50:57.187 回答
0

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

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

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

  3. 使客户端在先前操作成功后再次通过 AJAX 调用服务器。

  4. 在您的服务器上安装 pthreads PECL 扩展

于 2014-09-21T13:30:04.387 回答