【问题标题】:Send mail without blocking 'execution'在不阻止“执行”的情况下发送邮件
【发布时间】:2011-06-16 00:05:50
【问题描述】:

我在 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() 钩子可以让我在访客被重定向后发送邮件吗?

欢迎提出建议!

【问题讨论】:

    标签: php zend-framework zend-mail


    【解决方案1】:

    你为什么不试试这个:

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

    【讨论】:

    • 如果您的 90% 的用户允许 Ajax/Javascript,那么 90% 的电子邮件将被发送。这不是完成任务的最佳机制。
    【解决方案2】:

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

    【讨论】:

      【解决方案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 框架应用程序的所有功能 - 没有所有视图的东西。我通过在我的应用程序目录中创建一个新的 cronjobfoo.php 文件来实现这一点。然后我从:-my front controller (index.php) -my bootstrap.php

      我拿出了所有的视图材料 专注于保护环境 设置,数据库设置,自动加载器,& 注册表设置。我不得不采取一点 是时候更正文档根目录了 变量并删除一些OO 从我复制的功能 引导程序。

      在那之后我只是编码了..在我的 如果它正在编译并通过电子邮件发送出去 每晚报告。用起来很棒 Zend_Mail。当我确信 我的脚本按我的方式工作 想要,我只是将它添加到我的 crontab 中。

      祝你好运!

      【讨论】:

        【解决方案4】:

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

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2011-06-09
          • 1970-01-01
          • 1970-01-01
          • 2020-09-20
          • 1970-01-01
          • 2014-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多