Я использую 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, чтобы я мог отправить почту после того, как посетитель был перенаправлен?
Предложения приветствуются!
Почему бы вам не попробовать:
Поскольку PHP не поддерживает многопоточное программирование, единственное, что приходит на ум – это выполнить другую программу, которая обрабатывает отправку почты. Если вы контролируете свой хост, вы можете использовать exec () неблокирующимся способом. Проверьте эту тему – http://www.phpbuilder.com/board/showthread.php?t=10351142 за то, как это сделать
Я хотел бы предложить использовать задания cron, относительно легко, стабильно и просто подходит вам
здесь некоторые ссылки о ZF + cronjobs:
После некоторых исследований и много промедления я пришел к простому выводу, что ZF-ized cron-скрипт должен содержать все функциональные возможности вашего приложения zend framework – без всякого представления. Я достиг этого, создав новый файл cronjobfoo.php в каталоге приложения. Затем я взял минимальный минимум: -my front controller (index.php) -my bootstrap.php
Я вытащил все материалы для просмотра и сосредоточился на сохранении настроек среды, настройке db, автозагрузчике и настройке реестра. Мне пришлось потратить немного времени на исправление корневой переменной документа и удалить некоторые функции OO, скопированные из моего загрузочного файла.
После этого я просто закодировал. В моем случае он собирал и отправлял по электронной почте ночные отчеты. Было здорово использовать Zend_Mail. Когда я был уверен, что мой сценарий работает так, как я хотел, я просто добавил его кронтаб.
Удачи !
По умолчанию PHP не разрешает многопоточность. Некоторые способы выполнить вашу работу:
Используйте некоторую службу очереди сообщений, такую как IronMQ [рекомендуемый подход], который обеспечивает безопасный вызов API / cURL в вашу систему и запускает отдельный процесс без блокировки исполнения.
Используйте буферизацию вывода в PHP и используйте ob_flush, прежде чем начать операцию отправки почты.
Заставьте клиента снова вызвать сервер через AJAX при успешном выполнении предыдущей операции.
Установка расширения PECL на вашем сервере