6

大量の電子メールを処理し、渡されたパラメータに従ってそれらのコンテンツを解析するための一連の一括メール送信クラスを作成しました。データベースからの1000のランダムな受信者と1000のランダムな送信者で電子メールをテストすると、スクリプトがsend()部分に到達するまで(今はコメントしました)、約2秒のパフォーマンスと20MBのピークメモリが得られます。 、それは素晴らしいです。

ただし、送信部分のコメントを外すと、送信に30秒かかります。これは受け入れられないことであり、私はそれを何とかスピードアップしたいと思います。テストから明らかなように、遅延は$ mail-> send()呼び出しに他なりません。まるで、ループを続行して次の電子メールを送信する前に、何かが返されるのを待っているかのようです。

私が疑問に思っているのは、send()呼び出しを高速化するにはどうすればよいですか?それを速くするために私は何ができますか?2つの送信方法を使用してみました。

  1. Zend SMTPトランスポート、サーバーに直接接続して送信するだけです。これには、1000通の電子メールにつき30秒かかります。
  2. Zend_Mail経由でSendmail。各メールを準備した後、Zend_Mailの送信関数を呼び出すだけです。これには60秒かかります。

キューイングは間違いなくオプションであり、クラスに組み込んでいることに注意してください。必要なのはcronをアクティブ化することだけで、それは魅力のように機能します。しかし、実際の送信とそれを高速化する方法について疑問に思っています。したがって、実際のsend()呼び出し。

4

3 に答える 3

2

メールをディレクトリに保存し、シェルスクリプト(cron /デーモン/...)を使用して送信します。

Zend_Mail::setDefaultTransport(
    new Zend_Mail_Transport_File(
        array(
            'path' => __DIR__,
            'callback' => function() {
                do {
                    $file = 'email-' . date('Y-m-d_H-i-s') . '_' . mt_rand() . '.eml';
                } while (file_exists($file));
                return $file;
            },
        )
    )
);
于 2011-07-12T13:10:57.823 に答える
2

サーバー上のMTAを高速化する必要があります。Postfixをお勧めします。各設定をよく読んで、微調整する方法を理解してください。商用ソリューションの場合、PowerMTAが良い選択だと聞きましたが、自分で試したことはありません。

1台のマシンから引き出すことができるパフォーマンスはそれほど多くありませんが、正しく構成すると、通常の専用サーバーはかなり印象的な量のメールを配信できるはずです。最大のパフォーマンスのボトルネックは通常、メールキューが保存されているディスクドライブであるため、SAS(10kまたは15k RPM)またはSSDドライブの使用を検討してください。

于 2011-07-12T07:23:32.560 に答える
0

PHPのpcntl-fork関数を掘り下げてみることができます。したがって、次の電子メールを解析している間、送信を別のプロセスに残すことができます。

次のプラン

電子メールオブジェクトをシリアル化してデータベースキューに保存し、別のスクリプトでそれらをバックグラウンドで送信することができます。このスクリプトは、反復ごとにいくつかの無限ループ(while true)で実行できます。sleepこのスクリプトの複数のインスタンスを実行することもできますが、2つのスクリプトが同じ電子メールの送信を同時に開始しないようにしてください。

スクリプトがまだ実行されていることを確認するには、Unixマシンでmonitを使用できます。古いインスタンスが何らかの理由で失敗した場合、スクリプトを開始できます。

于 2011-07-12T07:24:47.497 に答える