国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

SHELL腳本保護(hù)PHP腳本不掛掉守護(hù)進(jìn)程實(shí)例

2020-03-22 20:02:06
字體:
供稿:網(wǎng)友
  • 以下是對用shell腳本作為保證PHP腳本不掛掉的守護(hù)進(jìn)程實(shí)例進(jìn)行了分析介紹,需要的朋友可以參考下

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

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

    方案詳細(xì)
    1、臨時(shí)保存用戶名單表users,表結(jié)構(gòu)如下:


    CREATE TABLE `users` (`account` varchar(50) COMMENT '用戶名',`has_phone` tinyint(3) unsigned NOT NULL default '0' COMMENT '是否有手機(jī)號',`has_email` tinyint(3) unsigned NOT NULL default '0' COMMENT '是否有郵箱',`flag` tinyint(3) unsigned  NOT NULL default '0' COMMENT '標(biāo)志位',PRIMARY KEY  (`account`),KEY `flag` (`flag`)) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='名單表';

    我先將2000多w用戶名導(dǎo)入到這個(gè)臨時(shí)表,has_phone與has_email這二個(gè)字段默認(rèn)都是0(沒有),標(biāo)志位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)入到表之后,再寫一個(gè)簡單的PHP腳本,思路是這樣的:每次循環(huán)從表取flag=0的500個(gè)用戶,然后請求接口判斷用戶是否有手機(jī)號、郵箱, 生成一條SQL,保存到一個(gè)SQLS數(shù)組里,等500個(gè)用戶全部檢測完了之后,循環(huán)SQLS數(shù)組,更新表里這500個(gè)名單,并將flag標(biāo)志位設(shè)置為1, 表示已經(jīng)檢測完,下次就不獲取了。
    由于PHP腳本代碼較長,這里分享下簡單的代碼說明:


    <?phphtml' target='_blank'>class Users{private $data;private $sqls;private $nums;         //判斷是否有500用戶private $total_nums;   //當(dāng)前已經(jīng)檢測完的用戶數(shù)量//每次取500個(gè)用戶private function getUsers(){...}//檢測這500個(gè)用戶并生成SQLprivate function checkUserInfo(){...}//更新這500個(gè)用戶private function updateUserInfo(){...}//運(yùn)行public function run(){$flag = true;while($flag){if($this->nums != 500){ $flag = false; }if($this->total_nums == 10000){exit(0); //跑完1w個(gè)用戶就退出,由守護(hù)進(jìn)程啟動(dòng)}$this->getUsers();$this->checkUserInfo();$this->updateUserInfo();sleep(1); //跑完500用戶休息1秒,保護(hù)用戶檢測接口}}}$user = new Users();$user->run();?>

    上面是簡潔版的PHP腳本,大概意思到了,剛開始的版本是沒有$total_nums這個(gè)變量,是因?yàn)閯傞_始跑這個(gè)腳本的時(shí)候,發(fā)現(xiàn)只跑完了4w多條腳本就掛球了,后來一看,是因?yàn)檫B接數(shù)據(jù)庫沒連上,腳本一直掛在那里。加上這個(gè)變量也無法解決這個(gè)問題,只是在每次跑完1w個(gè)用戶之后,PHP腳本退出,再由下面的shell腳本重新啟動(dòng)。3、shell腳本作為守護(hù)進(jìn)程
    我把這個(gè)shell腳本加到了crontab里邊,每隔1分鐘執(zhí)行一次,這個(gè)shell腳本很簡單,檢測check_users.php是否存在進(jìn)程id,如果存在,則說明PHP腳本還在運(yùn)行,shell腳本不做任何操作;如果不存在,則說明PHP腳本已經(jīng)exit(0)跑完了1w用戶退出了,那么shell腳本啟動(dòng)該腳本,進(jìn)入下一個(gè)1w用戶名單的檢測。
    上面我有講到,如果PHP腳本在連接數(shù)據(jù)庫的時(shí)候,無法連接上的時(shí)候,PHP會(huì)一直掛球在那里,無法退出了。我在shell腳本里加了一個(gè)時(shí)間檢測,當(dāng)PHP腳本進(jìn)程存在的時(shí)候,計(jì)算已經(jīng)存在了多長時(shí)間,如果超過了我預(yù)想的時(shí)間,則將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ù)只是舉個(gè)栗子,不要太認(rèn)真,2000w數(shù)據(jù),我估計(jì)要跑一段時(shí)間了,因?yàn)闄z測接口比較慢,接口在接到請求后還要連表,查表,再返回。其實(shí),最好的方法還是直接從接口請求的表拉一份名單出來,再用shell命令處理下很快就有結(jié)果了,可是在公司就是這樣,有些東西不開放的,你懂的~~~

    PHP編程

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

  • 發(fā)表評論 共有條評論
    用戶名: 密碼:
    驗(yàn)證碼: 匿名發(fā)表
    主站蜘蛛池模板: 奉节县| 玛多县| 长沙县| 红桥区| 云霄县| 绥化市| 平潭县| 泌阳县| 赤水市| 金门县| 修文县| 隆化县| 洪泽县| 天门市| 娱乐| 景泰县| 保德县| 嵊泗县| 德惠市| 怀远县| 磐石市| 泸溪县| 双桥区| 河南省| 扎兰屯市| 阿克苏市| 弥勒县| 稷山县| 宁波市| 元阳县| 元朗区| 磴口县| 建昌县| 西丰县| 鄂伦春自治旗| 金塔县| 论坛| 凌海市| 云安县| 溧阳市| 香格里拉县|