shellスクリプトはPHPスクリプトが掛けられないことを保証するデーモンプロセスのインスタンスとして共有されます

3596 ワード

先日から1部のデータのリストを走って、リストはユーザー名を提供する必要があります、携帯電話の番号があるかどうか、メールボックスがあるかどうか、ユーザーのリストは私は簡単に取得しましたが、ユーザーのリストは2000 w以上あります.その後、戻り値を分析して知ることができます.以下は私が処理する方案です:1、2000 wリストを臨時データ表2に保存して、PHPプログラムで毎回この表から500人のユーザーを取得して、検出が終わった後にSQL update原記録を生成します3、PHPプログラムが突然切れないように、shellスクリプトで1分おきに検出して、PHPが切れたらshellスクリプトを保護プロセスとして再起動する原因は、携帯電話とメールボックスの検出インタフェースの速度が遅く、1~2日で2000 wユーザーを検出することは不可能である.シナリオ詳細:1、ユーザー名単表usersを一時保存し、表構造は以下の通りである.
 
  
CREATE TABLE `users` (
  `account` varchar(50) COMMENT ' ',
  `has_phone` tinyint(3) unsigned NOT NULL default '0' COMMENT ' ',
  `has_email` tinyint(3) unsigned NOT NULL default '0' COMMENT ' ',
  `flag` tinyint(3) unsigned  NOT NULL default '0' COMMENT ' ',
  PRIMARY KEY  (`account`),
  KEY `flag` (`flag`)
 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT=' ';

まず2000人以上のwユーザー名をこのテンポラリテーブルにインポートしますhas_phoneとhas_Emailの2つのフィールドのデフォルトは0(いいえ)で、フラグビットflagはユーザーが検出したかどうかを示します.
次は一部のテーブルデータです:9873 aaa,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;
    private $sqls;
    private $nums;         // 500
    private $total_nums;   //

    // 500
    private function getUsers(){...}

    // 500 SQL
    private function checkUserInfo(){...}

    // 500
    private function updateUserInfo(){...}

    //
    public function run(){
        $flag = true;
        while($flag){
             if($this->nums != 500){ $flag = false; }
             if($this->total_nums == 10000){ 
                exit(0); // 1w ,
             }
             $this->getUsers();
             $this->checkUserInfo();
             $this->updateUserInfo();
             sleep(1); // 500 1 ,      
         }
    }
}

$user = new Users();
$user->run();
?>

上は簡潔版のPHPスクリプトで、大体意味が着いて、最初のバージョンは$totalがありませんでしたnumsという変数は、このスクリプトを走り始めたばかりの頃、4 w以上のスクリプトを走り終えただけでボールを切ったことに気づいたので、後で見ると、接続データベースがつながっていないので、スクリプトがずっとそこにかかっていました.この変数を加えてもこの問題を解決することはできませんが、1 w人のユーザーが走るたびにPHPスクリプトが終了し、次のshellスクリプトから再起動します.
3、shellスクリプトをデーモンプロセスとしてcrontabにこのshellスクリプトを追加し、1分おきに実行します.このshellスクリプトは簡単で、checkを検出します.users.phpにプロセスidが存在するかどうかは、存在する場合、PHPスクリプトがまだ実行されていることを示し、shellスクリプトは何もしない.存在しない場合、PHPスクリプトがexit(0)で1 wユーザが終了したことを示すと、shellスクリプトはスクリプトを起動し、次の1 wユーザリストの検出に入る.PHPスクリプトがデータベースに接続されている間に接続できない場合、PHPはずっとボールを掛けて、退出できません.私はshellスクリプトに時間検出を追加し、PHPスクリプトプロセスが存在する場合、計算にどのくらいの時間が存在しているかを計算し、私の予想時間を超えたら、PHPスクリプトkillを削除し、再起動します.
先頭の例データは、testalexlee,1,0,1 codejiaと同様の結果を得る.net,0,0,1 haohdouywaa21,1,1,1 9873aaa,0,1,1 adddwwwd876222,1,0,1
最后に、以上のユーザーリストのデータは栗を挙げるだけで、あまりまじめにしないでください.2000 wのデータは、私はしばらく走ると思います.検出インタフェースが遅いので、インタフェースは要求を受けてから表をつなぎ、表を調べて、戻ってきます.実は、一番いい方法はやはり直接インタフェースから要求した表からリストを引いて、shell命令で処理してすぐに結果が出て、しかし会社ではこのようにして、いくつかのものは開放しないで、あなたは知っています~~~