ホームページ  >  記事  >  バックエンド開発  >  PHP スクリプトがハングアップしないようにするデーモンの例としてのシェル スクリプト_PHP チュートリアル

PHP スクリプトがハングアップしないようにするデーモンの例としてのシェル スクリプト_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-20 11:12:51948ブラウズ

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

以下は私が対処した解決策です:

1. 2000wリストを一時データテーブルに保存します

2. PHP プログラムを使用してテーブルから毎回 500 ユーザーを取得し、検出後に元の SQL 更新レコードを生成します

3. PHP プログラムが突然切断されるのを防ぐため、PHP がハングした場合はシェル スクリプトを使用して再起動します。

デーモンとしてシェルスクリプトを使用する理由は、携帯電話とメールボックスの間の検出インターフェイスが遅く、1 ~ 2 日で 2,000 万人のユーザーを検出するのは不可能だからです。

プラン詳細:

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

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

以下はテーブルデータの一部です:

9873aaa,0,0,0

追加wwwd876222,0,0,0

テスターエクスリー,0,0,0

codejia.net,0,0,0

ハオドゥイワア21,0,0,0

2. PHP スクリプト check_users.php

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

PHP スクリプトのコードは長いため、ここに簡単なコードの説明を示します:

リーリー

上記は 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 スクリプトを強制終了して再起動します。


冒頭のデータ例では、結果は次のようになります。

テスタレックスリー,1,0,1

コードジア.ネット,0,0,1

ハオドゥイワア21,1,1,1

9873aaa,0,1,1

adddwwwd876222,1,0,1


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

http://www.bkjia.com/PHPjc/440403.html

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