ホームページ >バックエンド開発 >PHPチュートリアル >PHP スクリプトがハングアップしないようにするため、シェル スクリプトはデーモンの例として共有されます_PHP チュートリアル

PHP スクリプトがハングアップしないようにするため、シェル スクリプトはデーモンの例として共有されます_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:00:54761ブラウズ

数日前にデータリストの実行を開始しました。リストにはユーザー名、携帯電話番号の有無、メールアドレスの有無が必要ですが、ユーザーリストは 2,000 万人もいます。また、ユーザーが携帯電話番号を持っているかどうか、メールボックスがあるかどうかも、外部に公開された安全なインターフェイスを通じてユーザーが 1 つずつ要求する必要があり、その戻り値を分析することで知ることができます。

以下は私の解決策です:
1. 2000w リストを一時データテーブルに保存します
2. PHP プログラムを使用してテーブルから毎回 500 ユーザーを取得し、検出後に SQL 更新元レコードを生成します
3 . PHP プログラムが突然切断されるのを防ぐために、PHP がハングした場合はシェル スクリプトを使用して再起動します。これは、モバイル間の検出インターフェイスをデーモンとして使用するためです。電話とメールボックスが遅く、100万〜2,000万人のユーザーを2日間でテストしました。


計画の詳細:
1. ユーザーリストテーブル users を一時的に保存します。テーブル構造は次のとおりです:

コードをコピーします コードは次のとおりです:
CREATE TABLE ` users` (
`account` varchar(50 ) COMMENT 'username',
`has_phone` tinyint(3) unsigned NOT NULL デフォルト '0' COMMENT '携帯電話番号をお持ちですか',
`has_email` tinyint( 3) unsigned NOT NULL デフォルト '0' COMMENT 'メールアドレスをお持ちですか? ',
`flag` tinyint(3) unsigned NOT NULL デフォルト '0' COMMENT 'flag',
PRIMARY KEY (`account`),
KEY `flag` (`flag`)
) ENGINE=InnoDB DEFAULT CHARSET= utf8 COMMENT='list table';

まず、この一時テーブルに 2,000 を超えるユーザー名をインポートしました。 has_phone と has_email の 2 つのフィールドは次のとおりです。デフォルトでは両方とも 0 (なし) は、ユーザーが検出されたかどうかを示します。

以下はテーブル データの一部です:
9873aaa,0,0,0
adddwwwd876222,0,0,0
testalexlee,0,0,0
codejia.net,0,0,0
haohdouywaa21,0 ,0, 0

2. PHP スクリプト check_users.php

ユーザー リストをテーブルにインポートした後、簡単な PHP スクリプトを作成します。アイデアは次のとおりです。各ループはテーブルから flag=0 の 500 人のユーザーを取得します。インターフェイスは、ユーザーが携帯電話番号と電子メール アドレスを持っているかどうかを判断し、SQL を生成して SQLS 配列に保存します。500 人のユーザーがすべて検出された後、SQLS 配列をループして、その 500 個のリストを更新します。テーブルを参照し、フラグ flag を 1 に設定します。 は、検出が完了したため、次回取得されないことを意味します。
PHP スクリプト コードは長いため、ここに簡単なコードの説明を示します:

コードをコピーします コードは次のとおりです:
class Users{
private $data; sqls;
private $nums; // ユーザーが 500 人いるかどうかを確認します
private $total_nums; // 現在検出されているユーザーの数

// 毎回 500 人のユーザーを取得します
関数 getUsers(){... }

これらの 500 人のユーザーと SQL を生成します
プライベート関数 checkUserInfo(){...}

//これらの 500 人のユーザーを更新します
プライベート関数 updateUserInfo(){...} //
パブリック関数 run() を実行します{ $ FLAG = TRUE;
While ($ FLAG) {
IF ($ this- & gt; nums! = 500) {$ flag = false;}
($ This- &nums == 10000) {
EXIT (
EXIT) ( 0); //10,000 ユーザーを実行した後に終了し、デーモン プロセスを開始します
updateUserInfo(); // 1 秒間休憩します。ユーザー検出インターフェースを保護するために 500 人のユーザーを実行しています
}
}
}

$user = 新しいユーザー();
$user->run();
上記は PHP スクリプトの簡潔なバージョンです。おそらく、最初のバージョンには $total_nums 変数がなかったことがわかりました。後で確認すると、データベースへの接続が確立されておらず、スクリプトがハングし続けているためです。この変数を追加してもこの問題は解決できませんが、毎回 10,000 ユーザーを実行すると、PHP スクリプトは終了し、次のシェル スクリプトによって再起動されます。

3. デーモンとしてのシェルスクリプト
このシェルスクリプトを crontab に追加し、1 分ごとに実行します。このシェルスクリプトは、check_users.php のプロセス ID が存在するかどうかを検出します。 PHP スクリプトがまだ実行中であり、シェル スクリプトが存在しない場合は、PHP スクリプトが exit(0) を終了し、10,000 人のユーザーが終了したことを意味し、シェル スクリプトがスクリプトを開始します。そして、次の 1,000 ユーザー リストの検出に入ります。
上で述べたように、接続時に PHP スクリプトがデータベースに接続できない場合、PHP は常にそこにボールを保持し、終了できません。シェルスクリプトに時間検出を追加しました。PHP スクリプトのプロセスが存在する場合、それが予想した時間を超えた場合は、PHP スクリプトを強制終了して再起動します。

たとえば、

で始まるデータの場合、結果は次のようになります:
testalexlee,1,0,1
codejia.net,0,0,1
haohdouywaa21,1,1,1
9873aaa,0,1,1
adddwwwd876222,1,0 ,1

最後に: 上記のユーザーリストのデータは単なる例です。2,000 万のデータでは、検出インターフェースが比較的遅いため、時間がかかると予想されます。リクエストを受信した後にテーブルに接続します。テーブルを検索して戻ります。実際、最良の方法は、インターフェイスによって要求されたテーブルからリストを直接取得し、シェル コマンドを使用してそれを処理することで、結果がすぐに得られます。ただし、これは会社の場合であり、一部の場合はそうではありません。開けてください~~~

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/328044.html技術記事数日前、リストにはユーザー名、携帯電話番号、メールアドレスが必要ですが、ユーザーリストは 2,000 万件もあります。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。