数日前にデータリストの実行を開始しました。リストにはユーザー名、携帯電話番号の有無、電子メールアドレスの有無を指定する必要がありましたが、ユーザーリストは 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