Отправлять почту без блокировки «выполнения»

Я использую Zend_Mail в приложении Zend Framework для отправки электронной почты с содержимым веб-контактной формы.

Сама почтовая рассылка работает отлично (im использует учетную запись 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 *

Это, похоже, не имеет особого значения, скрипт по-прежнему блокируется при отправке почты, после чего происходит перенаправление.

Возможно, я должен написать плагин Controller, будет ли использовать postDispatch () hook, чтобы я мог отправить почту после того, как посетитель был перенаправлен?

Предложения приветствуются!

Почему бы вам не попробовать:

  1. Загрузите представление
  2. Вызовите Ajax Script из представления, которое будет загружать контроллер, ответственный за отправку электронной почты.

Поскольку PHP не поддерживает многопоточное программирование, единственное, что приходит на ум – это выполнить другую программу, которая обрабатывает отправку почты. Если вы контролируете свой хост, вы можете использовать exec () неблокирующимся способом. Проверьте эту тему – http://www.phpbuilder.com/board/showthread.php?t=10351142 за то, как это сделать

Я хотел бы предложить использовать задания cron, относительно легко, стабильно и просто подходит вам

здесь некоторые ссылки о ZF + cronjobs:

  1. Как вы храните свои скрипты для заданий cron в 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. Создать cronjob с Zend Framework >>

После некоторых исследований и много промедления я пришел к простому выводу, что ZF-ized cron-скрипт должен содержать все функциональные возможности вашего приложения zend framework – без всякого представления. Я достиг этого, создав новый файл cronjobfoo.php в каталоге приложения. Затем я взял минимальный минимум: -my front controller (index.php) -my bootstrap.php

Я вытащил все материалы для просмотра и сосредоточился на сохранении настроек среды, настройке db, автозагрузчике и настройке реестра. Мне пришлось потратить немного времени на исправление корневой переменной документа и удалить некоторые функции OO, скопированные из моего загрузочного файла.

После этого я просто закодировал. В моем случае он собирал и отправлял по электронной почте ночные отчеты. Было здорово использовать Zend_Mail. Когда я был уверен, что мой сценарий работает так, как я хотел, я просто добавил его кронтаб.

Удачи !

По умолчанию PHP не разрешает многопоточность. Некоторые способы выполнить вашу работу:

  1. Используйте некоторую службу очереди сообщений, такую ​​как IronMQ [рекомендуемый подход], который обеспечивает безопасный вызов API / cURL в вашу систему и запускает отдельный процесс без блокировки исполнения.

  2. Используйте буферизацию вывода в PHP и используйте ob_flush, прежде чем начать операцию отправки почты.

  3. Заставьте клиента снова вызвать сервер через AJAX при успешном выполнении предыдущей операции.

  4. Установка расширения PECL на вашем сервере