1

私は20,000の電子メールアドレスのデータベースを持っており、継続的に増えています。電子メール100を1回送信してから、CURL phpを使用して同じページにアクセスしていますが、それでもページの実行タイムアウトが最大になりました。このphpスクリプトを共有(Hostgator)サーバーで実行しています。この問題を解決するにはどうすればよいですか?

私はこのスクリプトを次の方法で実行しています:

exec("php-cli file.php > testoutput.php 2>&1 & echo $!", $output)
4

2 に答える 2

1

データベースに列(または補助テーブル)を追加し、すべてのアドレスを最初に「作業対象」としてマークすることができます。

次に、スクリプトは次のようになります。

- SELECT the number of worked addresses and total addresses
- display a progress bar
- SELECT the lowest 100, or 50, or N addresses yet to be worked
- send the emails and mark them worked
- issue a javascript to refresh itself.

次に、クライアントには、進行状況バーが継続的に進み、タイムアウトになることのないページが表示されます(「N」が十分に小さい場合)。

AJAXでこれを行うこともできますが、それはやり過ぎかもしれません。

さらに、いくつかのトリックを使用して(まだ実行していない場合)、操作を高速化できます。1つの可能性は、複数のアドレスをBccとして「合体」させることです。電子メールの本文が同一の場合。そうすれば、1回の呼び出しで複数のメッセージを配信できます。Bccを超えないように注意してください。ISPが実施する可能性のある制限。この戦略はISP側でより多くのリソースを使用するため、それらに確認してください。

別の可能性(一緒に使用できます)は、ドメインでソートされた電子メールを送信することです。複数のメールサーバーは、可能であれば、リソースと時間を節約するために、1つの接続で同じサーバーに電子メールを送信しようとします。電子メールのグループをすべて同じドメインに送信すると、サーバーの処理が簡単になります。

この最後のケースでは、次のSELECTようなメールを送信します。

SELECT * FROM addresses
    WHERE (worked=0 AND active = 1)
    ORDER BY SUBSTRING_INDEX(email, '@', -1)
    LIMIT 20;

次に(mysql関数の例-PDOの方が優れています)、

while($tuple = mysql_fetch_assoc($exec))
{
    if (send_mail_to(...))
         $sent[] = $tuple['id'];
    else $failed[] = $tuple['id'];
}
// Now mark both SENT and FAILED as worked
$sentm = implode(',', $sent);
$failm = implode(',', $failed);

// UPDATE addresses SET worked = 1 WHERE id IN ($sentm,$failm);
// UPDATE addresses SET active = 0 WHERE id IN ($failm);

PHPセッションで開始時間を節約した場合は、次のようなダッシュボード付きの素敵なバーを表示することもできます。

+--------------------+
|########            | 
+--------------------+
40% processed
38% delivered
 2% failed
Expected time remaining 5 min 17"
于 2012-09-29T11:09:52.060 に答える
0

PHPの時間制限は、PHPのset_time_limit()関数を介して削除できます。

set_time_limit(0);

ただし、これは、プロセスに時間がかかりすぎていることにPHP自体が気付いたために、実行時間の長いプロセスが停止するという問題を解決するだけです。これは重要なステップですが、作業を小さなバッチに分割し、コードを再実行せずにプロセスを再開できるように構造化することで、長時間実行されるプロセスでの他のタイプの障害も予測する必要があります。全部。

于 2012-09-29T11:10:22.667 に答える