0

私は最近Swiftmailerライブラリを実装しましたが、初めて使用したとき、約 300 人にメールを送信するだけでよいにもかかわらず、php タイムアウト エラーが発生しました..set_time_limit(0);サーバーの制限に)

私の使い方はこんな感じです。

 $transport = Swift_SmtpTransport::newInstance('smtp.mydomain.com',25);
 $mailer = Swift_Mailer::newInstance($transport);
 $message = Swift_Message::newInstance();
 $message->setSubject($_POST['subj']);
 $message->setFrom(array('email' => 'Mysite'));
 $message->setTo($recipients);
 $message->setBody(strip_tags($messagebody));
 $message->addPart($messagebody, 'text/html');
 $numSent = $mailer->batchSend($message);
 printf("Sent %d messages\n", $numSent);

ここ$recipientsで、電子メールのカンマ区切りの配列です ( explode()mySQL クエリから作成されます)。

上記のコードのどの部分が script-timeout を生成するのかわかりません。ニュースレター機能に使用しているため、テストまたはデバッグするのはかなり難しいので、思いついた人には本当に感謝しています。この問題に対する(ほぼ)防弾の解決策:)

前もって感謝します !

ラース

4

4 に答える 4

4

cron にアクセスできる場合は、ニュースレターを送信するために必要なものをデータベースに入力してから、少数のメールを処理するスクリプトを実行する cron ジョブを使用してキューをポップします。

そうでない場合は、スクリプトの最後に system() ステートメントを記述して、それを self と呼び、次のニュースレターをパラメーターとして渡してから終了します。そのため、メールを送信するのに必要な回数だけスクリプトを実行します。

于 2009-08-17T17:54:01.197 に答える
2

送信メールあたりの受信者数を制限します。curl または cron を介してオフセット値を指定してスクリプトを「n」回呼び出しても、タイムアウトは発生しません。たとえば、$limit = 20 に設定します。次に、スクリプトを n 回呼び出します。

send.php?offset=0
send.php?offset=20

など... root スクリプト (send.php スクリプトを呼び出す) がタイムアウトした場合、最後のオフセットから引き続きメールを送信できます。

于 2009-09-28T07:08:45.293 に答える
1

[更新]以下のデータは、開発ボックスからSMTPサーバーを呼び出すためのものです。したがって、東ヨーロッパからまともな家庭用ADSLから米国のSMTPサーバー(私のプロジェクトのステージングサーバー)へ。すべてがステージングで実行されると、localhost php + mysql + Postfixで、この赤ちゃんが5つの個別の電子メールとBCCを30の受信者に送信するのに1秒もかかりません。かなりの光景...

Swiftmaielerは実際には同期的に動作し、SMTPサーバーが各電子メールを送信するのを待機して、失敗したメールアドレスの配列を取得します。したがって、100人の受信者にBCCを送信した場合、合計時間は次のようになります。サーバーとの通信にかかる時間+サーバーが100通の電子メールを送信する時間。100通の個別のメールを送信すると100*(通話時間+送信時間)になります。私のPostfixはメールごとに1秒かかり、通話時間も1秒なので、個々のメールを送信するのに2.5秒かかります。標準の30秒のタイムアウトでは、BCCで12の個別の電子メールまたは20の受信者になります。それは実際にはすべて推測ゲームです:P

これらのメーラーはすべて、set_time_limit(0)を必須として設計されているようです。30秒のタイムアウトがある人にとって、最も賢い方法は、開いたままで、xごとに「メールパケットの送信」(小さなもの-10)メソッドを呼び出すifrme+refreshまたはAjaxメカニズムを備えた「バッチ送信」ページを用意することです。秒。Ajaxを使用すると、スクリプトの応答を再度呼び出すことができます。

于 2009-09-28T06:51:20.663 に答える
-1

set_time_limit(0);コードの前に

EDITset_time_limit : () 関数を使用できないので、関数内にメールを送信するコードを入れて () を使用してみませんregister_shutdown_functionか? そうすれば、スクリプトがタイムアウトすると、関数が再度呼び出されます。

于 2009-08-17T17:35:01.703 に答える