1

メール購読を処理する PHP スクリプトがあります。

それは次のようなことをします:

foreach email to be sent:
    mailer->send-email
    print "Email sent to whoever."

現在、Web ホストによるレート制限が発生しています。メーリング ライブラリには組み込みのスロットルがあり、レートを確実に下回るようにスリープします。ただし、これにより、Web ページが実際にロードされるまでに数時間かかる場合があります。

クライアント側のブラウザがページの読み込みをあきらめることはありますか? これに対するより良い解決策はありますか?

4

2 に答える 2

4

これが Web ページの読み込み時に行われるのはなぜですか? これは、実行がスケジュールされているオフラインのバックエンド プロセスである必要があります。(cronタスクのスケジューリングについて調べてください。)

長時間実行されるプロセスは、そのプロセスを処理するバックエンド サービスに委任する必要があります。アプリケーション インターフェイス (Web ページなど) は、ユーザーに ( 1 時間以上?) 応答を待たせるのではなく、できるだけ早くユーザーに応答する必要があります。

アプリケーションは、通常、何らかの共有データ ソース (単純なデータベースなど) を使用して、バックエンド プロセスの進行状況を追跡し、その進行状況をユーザーに提示できます。それはいいです。ただし、プロセス自体はアプリケーションの外部で発生する必要があります。

たとえば、高いレベルで...

  1. 電子メールを処理するために実行するようにスケジュールされた PHP スクリプトを用意します。
  2. スクリプトが開始したら、開始されたことを示すレコードをデータベースに保存します。
  3. スクリプトが何らかのマイルストーンに到達するたびに、データベース レコードを更新してこれを示します。
  4. スクリプトが終了したら、データベース レコードを更新してこれを示します。
  5. そのデータベース レコードをチェックし、バックエンド プロセスの現在のステータスをユーザーに表示する Web アプリケーションを作成します。
于 2012-05-19T15:51:15.117 に答える
1

気にしないかもしれませんが、このスクリプトを強制的に存続させたとしても、長時間実行されるスクリプトを Web サーバー経由で意図的に実行するべきではありません。Web サーバーはリソースを大量に使用するスレッドまたはプロセスを使用してスクリプトを実行しますが、サーバーの Web 要求で使用できるスレッドまたはプロセスの量は限られています。長時間実行されるスクリプトは、基本的に、Web 訪問者のサーバーに使用できるプロセスのプールからそれらの 1 つを取り出します。

代わりに、php バイナリを直接実行する cron ジョブを使用してください。wget具体的には、cron ジョブの一部として、またはlynxその他の Web ブラウザーのようなプログラムを使用しないでください。これらのメソッドは、Web サーバーを介してスクリプトを実行するためです。cron コマンドには次のようなものが含まれている必要があります

php /full/path/to/the/script.php

于 2012-05-19T15:51:44.570 に答える