Отправить почту, не блокируя «выполнение» - PullRequest
2 голосов
/ 26 января 2011

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

Сама рассылка работает нормально (я использую учетную запись Google Apps), но обработка может занять довольно много времени (от нескольких секунд до почти минуты).

Мое действие контроллера обычно перенаправляет посетителя после отправки почты, поэтому я подумал, что смогу перенаправить посетителя до вызова $ mail-> send () и позволить сценарию продолжить работу в 'background':

Итак, я попробовал следующее:

$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 голосов
/ 26 января 2011

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

3 голосов
/ 27 января 2011

Я хотел бы предложить использовать задания 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 >>

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

Я убрал все элементы просмотра и сосредоточился на настройке среды, настройке БД, автозагрузчике и реестренастроить.Мне потребовалось немного времени, чтобы исправить корневую переменную документа и удалить некоторые функции OO, скопированные с моего загрузчика.

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

Goodluck!

1 голос
/ 26 января 2011

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

  1. Загрузить представление
  2. Вызовите сценарий Ajax из представления, который загрузит контроллер, отвечающий за отправку электронной почты.
0 голосов
/ 21 сентября 2014

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

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

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

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

  4. Установите расширение pthreads PECL на свой сервер

...