0

ニュースレターの購読者がいる2000のメーリングリストがあり、それらを大量にメールで送信する必要があると仮定します。サーバーには、スパムを防ぐために電子メールを送信するときに1時間ごとの制限があります。

1時間に300通または500通の電子メールを送信するものもありますが、これは十分に公平です。

swiftmailerスロットルプラグインを使用して、たとえば1分あたり8通の電子メール(8 *60分=500の制限を下回る合計480通のメール)を送信している間、サーバーは接続を閉じ、「404-見つかりませんページ」で応答します。

奇妙なことに、スクリプトの実行中に100以下の電子メールを送信しましたが、サーバーはプロシージャを無限ループに陥ったため処理し、スクリプトの実行を終了します。

スロットルプラグインなしで一度に500通のメールを送信しようとすると、それは魅力のように機能します。しかし、1500や2000などのメールをさらに送信する必要がある場合はどうなりますか?

スロットルプラグインがPHPのネイティブ関数sleep()を使用していることを読みました。これは、このような状況で適切に機能するはずです。

プロセスがHTTPプロトコルではなくCronJobを介して実行されれば、機能する可能性があるとのことです。wgetとcurlを使用してcronジョブを設定しようとしましたが、それでもうまくいきません。

私が行った調査から学んだことは、SwiftmailerでSMTPサーバーを使用する場合、3秒のプロセスに28秒かかることです(必要以上に長くなります)。すべてのクエリはすべて最適化され、すべてのデータはサーバーに過負荷をかけることなくメモリに適切に配置されます。

その後、SMTPを使用せずに試してみることにしましたが、Throttlerプラグインは(再び)正常に機能しませんでした。

任意の提案や推奨事項をいただければ幸いです。

編集:私もこれを読みました:SwiftMailerバッチ電子メールは私のサーバーをタイムアウトします

もちろん、私はこれを使用します:

ignore_user_abort(true);
set_time_limit(0);
ini_set('max_execution_time', 0);
ini_set('memory_limit', '256M');
ini_set('mysql.connect_timeout', 500);
ini_set('default_socket_timeout', 500);

PS:今のところ、スクリプトの動作を変更して、1分あたりの電子メールのユーザー入力に基づいてサーバーの制限を計算し、アクティブなサブスクライバーの総数が送信される電子メールに対して少ないか等しい場合は、スロットルプラグインなしでそれらを送信します。

よろしくお願いいたします。GeorgeGirtsou

4

1 に答える 1

3

これはSMTP接続のタイムアウトに関係していると思います。

メールをループで処理し、スロットルプラグインと組み合わせると、SwiftmailerはSMTPサーバーとの接続を閉じる機会がなく、1回の接続で送信されるメールの数にも制限がある場合があります。 。

そのため、AntiFloodプラグインも組み合わせて使用​​することをお勧めします。これにより、xメールが送信された後にSMTP接続が閉じられ、再接続されるまでy秒間待機します。

$transport->start()および$transport->stop()は、プラグインが使用しているSMTPサーバーに接続および切断するための手動の方法です。

SMTPトランスポートの場合、興味深いタイムアウトパラメータもあります。

優れたエラー処理のために、コードをtry {}catch{}に含めることもお勧めします。

これがお役に立てば幸いです。

于 2013-09-13T18:00:21.840 に答える