天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

shell腳本作為保證PHP腳本不掛掉的守護進程實例分享

前幾天開始跑一份數(shù)據(jù)名單,名單需要提供用戶名、是否有手機號、是否有郵箱,用戶名單我輕易的獲取到了,但是,用戶名單有2000w之多,并且去檢測用戶是否有手機號、是否有郵箱必須得通過一個對外開放的安全接口一個一個用戶去請求,然后分析返回值才能知道。

下面是我處理的方案:
1、將2000w名單保存到臨時數(shù)據(jù)表
2、用php程序每次從該表獲取500個用戶,檢測完后生成SQL update原紀錄
3、為了防止php程序突然斷掉,用shell腳本每隔1分鐘檢測,php掛掉了則重啟
我使用shell腳本作為守護進程的原因是,手機與郵箱的檢測接口速度慢,不可能在1~2天將2000w用戶檢測完。

方案詳細:
1、臨時保存用戶名單表users,表結(jié)構(gòu)如下:
復(fù)制代碼 代碼如下:
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用戶名導(dǎo)入到這個臨時表,has_phone與has_email這二個字段默認都是0(沒有),標志位flag說明該用戶是否已經(jīng)檢測完。
下面是一部分表數(shù)據(jù):
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
將 用戶名單導(dǎo)入到表之后,再寫一個簡單的php腳本,思路是這樣的:每次循環(huán)從表取flag=0的500個用戶,然后請求接口判斷用戶是否有手機號、郵箱, 生成一條SQL,保存到一個SQLS數(shù)組里,等500個用戶全部檢測完了之后,循環(huán)SQLS數(shù)組,更新表里這500個名單,并將flag標志位設(shè)置為1, 表示已經(jīng)檢測完,下次就不獲取了。
由于php腳本代碼較長,這里分享下簡單的代碼說明:
復(fù)制代碼 代碼如下:
<?php
class Users{
    private $data;
    private $sqls;
    private $nums;         //判斷是否有500用戶
    private $total_nums;   //當(dāng)前已經(jīng)檢測完的用戶數(shù)量

    //每次取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這個變量,是因為剛開始跑這個腳本的時候,發(fā)現(xiàn)只跑完了4w多條腳本就掛球了,后來一看,是因為連接數(shù)據(jù)庫沒連上,腳本一直掛在那里。加上這個變量也無法解決這個問題,只是在每次跑完1w個用戶之后,php腳本退出,再由下面的shell腳本重新啟動。

3、shell腳本作為守護進程
我把這個shell腳本加到了crontab里邊,每隔1分鐘執(zhí)行一次,這個shell腳本很簡單,檢測check_users.php是否存在進程id,如果存在,則說明php腳本還在運行,shell腳本不做任何操作;如果不存在,則說明php腳本已經(jīng)exit(0)跑完了1w用戶退出了,那么shell腳本啟動該腳本,進入下一個1w用戶名單的檢測。
上面我有講到,如果php腳本在連接數(shù)據(jù)庫的時候,無法連接上的時候,php會一直掛球在那里,無法退出了。我在shell腳本里加了一個時間檢測,當(dāng)php腳本進程存在的時候,計算已經(jīng)存在了多長時間,如果超過了我預(yù)想的時間,則將php腳本kill掉,再重啟。

開頭的舉例數(shù)據(jù),結(jié)果類似如下:
testalexlee,1,0,1
codejia.NET,0,0,1
haohdouywaa21,1,1,1
9873aaa,0,1,1
adddwwwd876222,1,0,1

說在最后:以上用戶名單數(shù)據(jù)只是舉個栗子,不要太認真,2000w數(shù)據(jù),我估計要跑一段時間了,因為檢測接口比較慢,接口在接到請求后還要連表,查表,再返回。其實,最好的方法還是直接從接口請求的表拉一份名單出來,再用shell命令處理下很快就有結(jié)果了,可是在公司就是這樣,有些東西不開放的,你懂的~~~

php技術(shù)shell腳本作為保證PHP腳本不掛掉的守護進程實例分享,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产精品青青青高清在线密亚 | 考好老师让你做一次H | 国产爱豆果冻传媒在线观看 | 看电影来5566一区.二区 | 99视频在线看观免费 | 三男强一女90分钟在线观看 | 日本久久道一区二区三区 | 日日噜噜大屁股熟妇 | 色宅男看片午夜大片免费看 | 成人在线视频免费 | 国产精品观看视频免费完整版 | 在线播放一区二区精品产 | 91久久线看在观草草青青 | 日本xxxxxxx| 欧美123区 | 99视频精品全部 国产 | 少妇高潮A片特黄久久精品网 | 亚洲欧美日本久久综合网站 | 18video性欧美19sex高清 | 午夜影院一区二区三区 | 女同给老师下媚药 | 色综合久久88一加勒比 | 国产精品成人啪精品视频免费观看 | 久久99精品国产99久久6男男 | 牛牛在线国产精品 | videosgrati欧美另类 | 国产免费午夜 | 亚洲精品青青草原avav久久qv | 我的漂亮朋友在线观看全集免费 | 三级貂蝉艳史 在线观看 | 翁熄性放纵交换01 | 羞羞答答的免费视频在线观看 | 色男人综合| 在教室伦流澡到高潮H女攻视频 | 爽爽影院免费观看 | 十分钟免费视频大全在线观看 | 日本亚洲欧洲免费旡码 | 蜜臀AV浪潮99国产麻豆 | 在线观看亚洲专区5555 | 午夜福利理论片高清在线 | 久久一区精品 |