2

Zend FrameworkアプリケーションでZend_Mailを使用して、Webベースの連絡フォームの内容を含む電子メールを送信しています。

郵送自体は正常に機能しますが(Google Appsアカウントを使用している場合)、処理にかなり時間がかかる場合があります(数秒から1分近くまで)。

私のコントローラーアクションは通常、メールの送信後に訪問者をリダイレクトするため、$ 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. cronジョブのスクリプトをZendFrameworkにどのように保存しますか?
  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. ZendFrameworkを使用してcronジョブを作成する>>

いくつかの調査と多くの先延ばしの後で、ZF化されたcronスクリプトには、すべてのビューのものなしで、zendフレームワークアプリのすべての機能が含まれている必要があるという単純な結論に達しました。これは、アプリケーションディレクトリに新しいcronjobfoo.phpファイルを作成することで実現しました。それから私は最低限のものを取りました:-myフロントコントローラー(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. サーバーにpthreadsPECL拡張機能をインストールします

于 2014-09-21T13:30:04.387 に答える