shell脚本作为保证脚本作为保证PHP脚本不挂掉的守护进程实例分享脚本不挂掉的守护进程实例分享
前几天开始跑一份数据名单,名单需要提供用户名、是否有手机号、是否有邮箱,用户名单我轻易的获取到了,但是,用户名
单有2000w之多,并且去检测用户是否有手机号、是否有邮箱必须得通过一个对外开放的安全接口一个一个用户去请求,然后
分析返回值才能知道。
下面是我处理的方案:下面是我处理的方案:
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();
评论0