PHP でのバックエンド実行プログラムの作成の概要
1. スケジュールされた実行 ????????? crontab、Linuxコマンド、使い方は自分でググってください。 crontab を使用するときは権限に注意する必要があることをお伝えしたいのですが、運用と保守では root を使用して起動することが多く、その結果、Web ユーザーが権限を持たないファイルが生成されることがあります。 2. バックグラウンドガード ??????? 2 つの手順: 1 php は Python とは異なりますが、ループ本体は {....} であるため、スクリプトに無限ループを記述する必要があります。通常はスリープを追加します。そうしないとマシンが強制終了されます。 2. プロセスを開始するときに、最後に「&」を追加する必要があります。出力情報を記録する必要がある場合は、これを行う必要があります。 php xxxx.php > /tmp /phplog & と書き込み、将来のトラブルシューティングを容易にするためにプログラム情報がファイルに記録されるようにします。 3. 動作監視 ?????? バックグラウンド デーモン プロセスが開始されましたが、これらのメッセージが表示された時点で、プログラムが警告メッセージを表示しないことを 100% 保証することはできません。バックグラウンドプログラムは直接終了します。したがって、通常の処理を行うプログラムに加えて、そのプログラムの実行状況を確認するプログラムも必要になります。このプログラムの例は次のとおりです。 ?#!/usr/local/php5/bin/php //起動コマンド ?$isOk = 0; ?$exec = $action . " > " . "xxxxxx_log &"; このプログラムをバックグラウンドで起動すると、5 秒ごとに ps コマンドを使用して、動作しているプログラムがあるかどうかを確認します。プログラムが存在しないか、5 つ未満の場合は、最大 5 つまで起動します。もちろん、この作業はシェルを使った運用保守に任せることもできますが、運用保守能力が不足している場合は自分で行う必要があります。 4. マルチプロセス ???? 効率を高めるために、通常、動作中の PHP は複数のプログラムを同時に起動するか、複数のマシン上で実行することもあります。このとき、複数のプロセスが同じデータを同時に処理するという問題を考慮する必要があります。このとき、私は通常、タスクのキューを作成します (通常、パフォーマンスが非常に優れている Redis を使用します。その方法は、Google で検索できます)。その後、作業プログラムが毎回作業対象のレコードをポップアウトします。たとえば、大規模なファイルを処理する必要がある場合、通常はファイルを処理して 1 つずつ Redis リストに追加し、複数のプログラムで同時に作業プログラムをポップできるようにします。重複することなく並行して実行されます。本当に Redis がない場合は、mysql を使用して innodb テーブルを構築できます。プログラムがデータを処理する前に、必ず処理対象のデータに読み取りロックを追加し、処理後にマークを追加するか、直接マークを追加します。データを削除することも可能です。複数のプロセスでの非重複の問題も実現できます。 5.ログ ???? バックグラウンド プログラムは通常実行され続け、何か問題が発生しない限り基本的に誰も気にしません。そのため、ログは非常に重要です。フロントエンド プログラムとは異なり、原因を調べてエラーの場所を確認します。ログが多すぎることや、ハードドライブのスペースを無駄にすることを恐れる必要はありません。ただし、バグは収入に直接影響する可能性があります。私は普段こんな感じで日記をつけています [マシンip]?[プロセスpid] [時刻] [現在のプログラムファイル名] [ファイル行数] [必要なパラメータと情報] [その他] これらは、通常のプログラムで考えられる問題です。一般に、プログラムの最外層に try catch が追加され、ほとんどの例外がキャッチされて記録されます (警告キャッチはキャッチできません)。かなり憂鬱です) 6. パフォーマンスの最適化 ??? このようなバックグラウンド プログラムの場合、通常、マシンの運用と保守は個別に実行され、マシンが実行できるプロセスの数を確認する必要があります。プロセッサがタスクの処理でビジー状態になったときに実行されます。マシンの CPU、メモリ、ネットワーク、およびハードディスクの使用率が同時に最大値に達すると、ハードウェアが無駄にならないようにするのが最善です。ディスク使用率が高く、他のディスク使用率が低い場合、プログラムを最適化します。この状況は、通常、読み取りおよび書き込みデータが一定期間メモリに一時的に保存され、CPU の場合はすぐにハードディスクに書き込まれます。が非常に高い場合は、アルゴリズムが複雑すぎるため、メモリとネットワークがボトルネックになることはなく、サーバーには少なくともギガビット ネットワーク カードが必要です。通常はボトルネックではありません。したがって、私は通常、これらのマシンで memcache を開きます (笑)、無駄はありません。 7. 余談 ??? サーバー close_wait についての質問です。通常、PHP プログラマーは、リンクを開いた後に接続を積極的に閉じる人はほとんどいませんが、多くのプログラマーはリンクを作成し、それを操作してからプログラムを実行します。完成しました。 PHP が積極的に接続を閉じない場合、相手のマシンは常に終了操作を待機します。相手のサーバー上では close_wait 状態が表示され、特にバックグラウンド プログラムの後では、マシンは 60,000 を超えるリンクしか開くことができません。が起動すると、相手のマシンはすぐにいっぱいになってしまい接続できなくなりました。このとき、両方の側でいくつかの変更を加える必要があります。一方で、PHP は積極的に切断する必要があり、他方では、相手のマシンは close_wait のデフォルトのタイムアウトをより短い時間に変更する必要があります (変更方法)。ご自身でググってください)。私は通常、memcache を 5 秒しか使用しません。データベースはそれよりも長く、2 分です。この処理の後、サーバーの継続性は大幅に向上し、同時実行能力も向上します。
$action = '/usr/local/php5/bin/php xxxxxx.php';
$logPath = '/tmp/logs/';
do {
?$result = array();
?exec("ps aux | grep 'xxxxxx.php'", $result);
?foreach ($result as $v) {
??$is = strpos($v, $action);
??if (false !== $is) {
???$isOk++;
??}
?}
?for ($i=1;$i??exec($exec);
?}
?sleep(5);
} while (true);