0

必要なときに特定のグループに大量の電子メールを送信する必要がある組織のために、ソーシャル ネットワーキング ソフトウェア Elgg を使用します。メールの数は、グループに応じて 10 ~ 1000 の範囲になります。Web ホストは 1 時間あたり 500 通のメールしか許可しないため、8 秒ごとに 1 通のメールを送信するようにスクリプトを調整する必要があります。

Elgg で PHPmailer を使用しています。PHPmailer は、これら 2 つのスクリプト (以下のコード) を相互に組み合わせて使用​​し、メール配信を抑制すべきだと言っています。メーリング スクリプトでコードをどのように使用するかはわかっていますが、いくつか不明な点があります。

1) セーフモードの目的がよくわからない

2) set_time_limit を調べた後、10 か 1000 かにかかわらず、すべての潜在的な電子メールを送信できるように、これを時間に設定する必要があるようです。または、タイムアウトが必要な場合に備えて、ループごとに最大 30 秒ですか?

3) 必要なものを取得するには、これをどのように設定すればよいですか?

コードを説明する PHPmailer へのリンク:

http://phpmailer.worxware.com/index.php?pg=tip_ext

http://phpmailer.worxware.com/index.php?pg=tip_pause

 <?php

/* The following code snippet with set the maximum execution time
 * of your script to 300 seconds (5 minutes)
 * Note: set_time_limit() does not work with safe_mode enabled
 */

$safeMode = ( @ini_get("safe_mode") == 'On' || @ini_get("safe_mode") === 1 ) ? TRUE : FALSE;
if ( $safeMode === FALSE ) {
  set_time_limit(300); // Sets maximum execution time to 5 minutes (300 seconds)
  // ini_set("max_execution_time", "300"); // this does the same as "set_time_limit(300)"
}

echo "max_execution_time " . ini_get('max_execution_time') . "<br>";

/* if you are using a loop to execute your mailing list (example: from a database),
 * put the command in the loop
 */

while (1==1) {
  set_time_limit(30); // sets (or resets) maximum  execution time to 30 seconds)
  // .... put code to process in here
  if (1!=1) {
    break;
  }
}

?>

<?php

/* Note: set_time_limit() does not work with safe_mode enabled */

while (1==1) {
  set_time_limit(30); // sets (or resets) maximum  execution time to 30 seconds)
  // .... put code to process in here

  usleep(1000000); // sleep for 1 million micro seconds - will not work with Windows servers / PHP4
  // sleep(1); // sleep for 1 seconds (use with Windows servers / PHP4
  if (1!=1) {
    break;
  }
}

?>
4

2 に答える 2

1
  1. セーフモードはphp5.3で非推奨になり、php 5.4で削除されたため、インストールが比較的最近の場合は、重要なポイントです:http: //php.net/manual/en/ini.sect.safe-mode.php#ini 。セーフモード

  2. set_time_limit()を実行すると、カウンターがリセットされます。コードが以前に設定された制限よりも短い時間でset_time_limit()呼び出しに到達する限り(たとえば、29秒で到達し、時計に1秒残っている)、コードはリセットされます。タイマーとさらに30秒を取得します。ただし、コードを際どいものにしたくないので、時間制限を完全に無効にする必要があります。

  3. 個人的には、8秒ごとに1通のメールをダンプすることはありません。許可されている500を爆破し、1時間に1回スクリプトを起動して、爆破が中断したところから再開するようにスケジュールされたジョブがあります。これにより、メールサーバーは少しバースト的になりますが、同じ受信者ドメインの電子メールをまとめることができるため、長期的にはより効率的になる可能性があります。たとえば、500のグループ内のすべての@ aol.comメールは、サーバーを強制的にaolに複数回接続して個々のメールを配信するのではなく、一緒に送信できます。

同様に、このようにバッチ処理している場合、サーバーの障害は、スクリプトが実際に実行されて電子メールを作成している数秒間だけ「悪い」状態になります。残りの時間はPHPスクリプトも実行されず、SMTPサーバーがその処理を実行します。

于 2012-11-07T20:45:28.073 に答える
0

私は迅速で具体的な助けにはならないかもしれませんが、非同期アプローチを検討します。

これには、キューに電子メールを送信するためのタスクを保存し、それらのタスクを処理するワーカーを配置することが含まれます。

最も簡単な方法は、電子メールをデータベースに保存し、サーバー上でcronジョブを実行して、電子メールをバッチで送信することです。

より良い(しかしより複雑な)解決策は、 zeromqや重いrabbitmqのようなある種のメッセージキューシステムを使用することです。

私の頭のてっぺんからの最後のそしておそらく最も快適なオプションは、MailChimpPostmarkのようなWebサービスを使用することです。

于 2012-11-07T20:49:29.360 に答える