中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

shell腳本作為保證PHP腳本不掛掉的守護進程的原因有哪些

發布時間:2021-10-11 23:23:33 來源:億速云 閱讀:157 作者:iii 欄目:開發技術

這篇文章主要講解了“shell腳本作為保證PHP腳本不掛掉的守護進程的原因有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“shell腳本作為保證PHP腳本不掛掉的守護進程的原因有哪些”吧!


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

方案詳細:
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這二個字段默認都是0(沒有),標志位flag說明該用戶是否已經檢測完。
下面是一部分表數據:
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
將 用戶名單導入到表之后,再寫一個簡單的PHP腳本,思路是這樣的:每次循環從表取flag=0的500個用戶,然后請求接口判斷用戶是否有手機號、郵箱, 生成一條SQL,保存到一個SQLS數組里,等500個用戶全部檢測完了之后,循環SQLS數組,更新表里這500個名單,并將flag標志位設置為1, 表示已經檢測完,下次就不獲取了。
由于PHP腳本代碼較長,這里分享下簡單的代碼說明:

復制代碼 代碼如下:

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

3、shell腳本作為守護進程
我把這個shell腳本加到了crontab里邊,每隔1分鐘執行一次,這個shell腳本很簡單,檢測check_users.php是否存在進程id,如果存在,則說明PHP腳本還在運行,shell腳本不做任何操作;如果不存在,則說明PHP腳本已經exit(0)跑完了1w用戶退出了,那么shell腳本啟動該腳本,進入下一個1w用戶名單的檢測。
上面我有講到,如果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

感謝各位的閱讀,以上就是“shell腳本作為保證PHP腳本不掛掉的守護進程的原因有哪些”的內容了,經過本文的學習后,相信大家對shell腳本作為保證PHP腳本不掛掉的守護進程的原因有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

会泽县| 蓝田县| 聂荣县| 灵武市| 泽库县| 泸州市| 波密县| 大冶市| 吴忠市| 梧州市| 怀柔区| 万宁市| 奇台县| 溧阳市| 阳山县| 吉木萨尔县| 抚顺市| 江陵县| 赤壁市| 万盛区| 龙陵县| 华蓥市| 剑河县| 临高县| 东乡| 彭山县| 诸城市| 湘乡市| 磐石市| 梅河口市| 丰宁| 黔江区| 彰武县| 砚山县| 卫辉市| 股票| 上杭县| 静海县| 兴安县| 宁城县| 漯河市|