大手チェーン店は大きな問題を抱えている。毎日、あらゆる店舗で何千もの取引が発生します。会社の幹部はこのデータをマイニングしたいと考えています。どの商品がよく売れているのか?何がダメなの?オーガニック製品はどこでよく売れますか?アイスクリームの売れ行きはどうですか?
このデータを取得するには、組織はすべてのトランザクション データを、企業が必要とする種類のレポートの生成により適したデータ モデルに読み込む必要があります。ただし、これには時間がかかり、チェーンが成長するにつれて、1 日分のデータを処理するのに 1 日以上かかる場合があります。したがって、これは大きな問題です。
さて、Web アプリケーションはこれほど大量のデータを処理する必要はないかもしれませんが、どのサイトでも処理に顧客が期待する以上に時間がかかる可能性があります。一般に、顧客が許容できる待ち時間は 200 ミリ秒です。この時間を超えると、顧客はプロセスが「遅い」と感じます。この数字はデスクトップ アプリケーションに基づいていますが、Web ではより忍耐強くなります。しかし、何があっても、顧客を数秒以上待たせてはいけません。したがって、PHP でバッチ ジョブを処理するためにいくつかの戦略を採用してください。
cron を使用した分散型の方法
UNIX® マシンでは、バッチ処理を実行するコア プログラムは cron デーモンです。デーモンは、どのコマンド ラインをどのくらいの頻度で実行するかを指示する構成ファイルを読み取ります。その後、デーモンは設定に従ってそれらを実行します。エラーが発生した場合、問題のデバッグに役立つように、指定された電子メール アドレスにエラー出力を送信することもできます。
私はスレッド技術の使用を強く主張するエンジニアを何人か知っています。 「スレッドです! スレッドはバックグラウンド処理を行うための本当の方法です。cron デーモンはとても時代遅れです。」
そうは思わない。
私は両方の方法を使用しましたが、cron には「Keep It Simple, Stupid (KISS、シンプルは美しい)」という原則の利点があると思います。バックグラウンド処理をシンプルに保ちます。常に実行される (メモリ リークがないように) マルチスレッドのジョブ処理アプリケーションを作成する代わりに、cron は単純なバッチ スクリプトを開始します。このスクリプトは、処理するジョブがあるかどうかを判断し、ジョブを実行して終了します。メモリリークを心配する必要はありません。また、スレッドが停止したり、無限ループに陥ったりすることを心配する必要もありません。
では、cron はどのように機能するのでしょうか?これはシステム環境によって異なります。ここでは古い単純な cron の UNIX コマンド ライン バージョンについてのみ説明します。これを独自の Web アプリケーションに実装する方法をシステム管理者に問い合わせてください。
これは、毎晩午後 11 時に PHP スクリプトを実行する単純な cron 設定です。
0 23 * * * ジャック /usr/bin/php /users/home/jack/myscript.php
最初の 5 つのフィールドは、スクリプトをいつ開始するかを定義します。次に、このスクリプトの実行に使用するユーザー名を指定します。残りのコマンドは、実行されるコマンド ラインです。時間フィールドは、分、時間、日、月、曜日です。以下にいくつかの例を示します。
コマンド:
15 * * * * ジャック /usr/bin/php /users/home/jack/myscript.php
毎時 15 分にスクリプトを実行します。
コマンド:
15,45 * * * * ジャック /usr/bin/php /users/home/jack/myscript.php
毎時 15 分と 45 分にスクリプトを実行します。
コマンド:
*/1 3-23 * * * ジャック /usr/bin/php /users/home/jack/myscript.php
午前 3 時から午後 11 時までの間、毎分スクリプトを実行します。
コマンド
30 23 * * 6 ジャック /usr/bin/php /users/home/jack/myscript.php
毎週土曜日の午後 11 時 30 分にスクリプトを実行します (土曜日は 6 で指定されます)。
ご覧のとおり、組み合わせの数は無制限です。必要に応じて、スクリプトをいつ実行するかを制御できます。実行する複数のスクリプトを指定して、一部のスクリプトを毎分実行し、他のスクリプト (バックアップ スクリプトなど) を 1 日に 1 回だけ実行することもできます。
報告されたエラーの送信先電子メール アドレスを指定するには、次のように MAILTO ディレクティブを使用できます。
MAILTO=jherr@pobox.com
注: Microsoft® Windows® ユーザーの場合は、コマンド ライン プロセス (PHP スクリプトなど) を定期的に起動するために使用できる、同等のスケジュール タスク システムがあります。
以上、PHP cron におけるバッチ処理コマンドの内容を含めて紹介しましたが、PHP チュートリアルに興味のある友人の参考になれば幸いです。