ホームページ  >  記事  >  バックエンド開発  >  PHP でのバックエンド実行プログラムの作成の概要

PHP でのバックエンド実行プログラムの作成の概要

巴扎黑
巴扎黑オリジナル
2016-11-23 14:42:411861ブラウズ

1. スケジュールされた実行

crontab、Linuxコマンドの使い方は自分でググってください。 crontab を使用するときは、アクセス許可に注意する必要があることをお伝えしたいのですが、操作とメンテナンスでは root を使用して起動することが多く、その結果、Web ユーザーがアクセス許可を持たないファイルがいくつか発生します。

2. バックグラウンドガード

これは 2 つのステップに分かれています: 1. php は Python とは異なりますが、通常は {....} を実行します。 2. プロセスを開始するときに、最後に「&」を追加する必要があります。出力情報を記録する必要がある場合は、これを記述する必要があります。 php xxxx.php > /tmp/phplog & 。これにより、プログラム情報がファイルに記録され、後で問題のトラブルシューティングが容易になります。

3. 動作の監視

バックグラウンド デーモン プロセスが開始されますが、これらのメッセージが表示されると、PHP は現在のプロセスを終了します。直接辞めます。したがって、通常の処理を行うプログラムに加えて、そのプログラムの実行状況を確認するプログラムも必要です。通常、このプログラムの例は次のとおりです

#!/usr/local/。 php5/bin/php

//起動コマンド
$action = '/usr/local/php5/bin/php xxxxxx.php';
$logPath = '/tmp/logs/';


do {
$result = array ();
exec("ps aux | grep 'xxxxxx.php'", $result);

$isOk = 0;
foreach ($result as $v) {
$is = strpos($v, $action );
if (false !== $is) {
$isOk++;
}
}

$exec = $action . " > " . $logPath &";
for ($i=1; $i exec($exec);
}
sleep(5);
} while (true);

このプログラムを開始する5 秒ごとに ps コマンドを使用して、動作するプログラムが存在するかどうかを確認し、プログラムが存在しない場合、または存在するプログラムが 5 つ未満の場合は、最大 5 つまで起動します。もちろん、この作業はシェルを使った運用保守に任せることもできますが、運用保守能力が不足している場合は自分で行う必要があります。

4. マルチプロセス

効率を高めるために、通常、PHP は複数のプロセスを同時に開始するか、複数のマシン上で実行されます。このとき、複数のプロセスが同じデータを同時に処理するという問題を考慮する必要があります。このとき、私は通常、タスクのキューを作成します (通常、パフォーマンスが非常に優れている Redis を使用します。その方法は、Google で検索できます)。その後、作業プログラムが毎回作業対象のレコードをポップアウトします。たとえば、大規模なファイルを処理する必要がある場合、通常はファイルを処理して 1 つずつ Redis リストに追加し、複数のプログラムで同時に作業プログラムをポップできるようにします。重複することなく並行して実行されます。本当に Redis がない場合は、mysql を使用して innodb テーブルを構築できます。プログラムがデータを処理する前に、必ず処理対象のデータに読み取りロックを追加し、処理後にマークを追加するか、直接マークを追加します。データを削除することも可能です。複数のプロセスでの非重複の問題も実現できます。

5. ログ

バックグラウンドプログラムは通常実行され続け、何か問題が発生しない限り基本的に誰も気にしないため、ログは非常に重要です。フロントエンド プログラムとは異なり、原因を調べてエラーの場所を確認します。ログが多すぎることや、ハードドライブのスペースを無駄にすることを恐れる必要はありません。ただし、バグは収入に直接影響する可能性があります。普段こんな感じでログを取っています

[マシンIP] [プロセスpid] [時刻] [現在のプログラムファイル名] [ファイル行数] [必要なパラメータと情報] [その他]

これらが考えられるものです通常のプログラムの問題。通常、try catch はプログラムの最外層に追加されるため、ほとんどの例外をキャッチして記録できます (警告キャッチは利用できず、非常に憂鬱です)

6. パフォーマンス最適化

このような背景 通常、プログラムの運用と保守はマシンに対して個別に行われます。このとき、マシンが実行できるプロセスの数を確認するためにストレス テストを実行する必要があります。プロセッサがタスクの処理でビジー状態になっている場合、マシンの CPU、メモリ、ネットワーク、およびハードディスクの使用量を確認し、マシンが無駄にならないように、同時に最大値に達することが最善です。使用率が非常に高く、その他の使用率が非常に低い場合、プログラムを最適化する必要があります。この場合、通常は読み取りの場合です。書き込まれたデータは一定期間メモリに一時的に保存され、その後、メモリに書き込まれます。 CPU が非常に高い場合は、アルゴリズムが複雑すぎるため、メモリとネットワークがボトルネックになることはなく、PHP は少なくともメモリをあまり使用しません。ギガビット ネットワーク カード これら 2 つの項目は通常、ボトルネックではありません。したがって、私は通常、これらのマシンで memcache を開きます (笑)、無駄はありません。

7.

サーバーclose_waitについての質問です。一般に、PHP プログラマーは接続を開いた後に積極的に閉じる人はほとんどいません。たとえば、データベースや memcache に接続する場合、多くのプログラマーはリンクを作成し、それを操作してからプログラムの実行を完了します。 PHP が積極的に接続を閉じない場合、相手のマシンは常に終了操作を待機します。相手のサーバー上では close_wait 状態が表示され、特にバックグラウンド プログラムの後では、マシンは 60,000 を超えるリンクしか開くことができません。が起動すると、相手のマシンはすぐにいっぱいになってしまい接続できなくなりました。このとき、両方の側でいくつかの変更を加える必要があります。一方で、PHP は積極的に切断する必要があり、他方では、相手のマシンは close_wait のデフォルトのタイムアウトをより短い時間に変更する必要があります (変更方法)。ご自身でググってください)。私は通常、memcache を 5 秒しか使用しません。データベースはそれよりも長く、2 分です。この処理の後、サーバーの継続性が大幅に向上し、同時実行能力も向上します。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。