/*
* 方案二
* 按照当前的时间,不论当前时间是几点,都算24小时,向后推移n天
* 1,需要在新增网站的时候,将site_id写入到临时表中,新增网站时,必须有create_time
* */
public function run_timerB()
{
define('BASE_PATH', str_replace('\\', '/', realpath(dirname(__FILE__) . '/')) . '/');
$sql = 'SELECT si.on_off,si.id ,si.site,si.sitename,si.create_time,si.flu_count,te.status,te.pre_time,te.next_time FROM sem_site si inner join sem_temp te on te.site_id=si.id where si.on_off=1 and delete_time=0 ;';
$result = Db::query($sql);
foreach ($result as $key => $value) {
//1, 检查‘刚录入’的网站,计算出下一次更新的时间,并写入数据库
if ($value['status'] =="刚录入") {
$createtime = $value['create_time']; //网站第一次录入的时间,及第一次确定刷新天数的时间
$cre = date('Y-m-d', strtotime($createtime));
// $next = date('Y-m-d H:i:s',(strtotime($cre)+3600*24)); //成功获取到下一天的 2019-07-04 00:00:00
// echo $createtime.'<br/>';
$flu_time = $value['flu_count'];
$next = date('Y-m-d H:i:s', (strtotime($cre) + 3600 * 24 * ($flu_time + 1))); //n+1天的凌晨开始更新,就是下一次的更新时间
// echo $next;
// 将下一次更新的时间写入数据库,
$sql = 'UPDATE sem_temp SET next_time = ?,`status` = ? WHERE site_id = ?';
Db::execute($sql, [$next, '已更新', $value['id']]);
// echo '更新next_time成功';
}
// 2,将所有'已更新'的网站的‘next_time’获取到,并与当前时间进行比较,如果在规定时间内,那么执行更新操作,并且将此次开始更新的时间,写入'pre_time'字段,并且更新‘next_time’
if ($value['status'] == '已更新') {
$sql1 = 'select k.keywords,k.id,s.site from sem_keyword k inner join sem_site s on s.id = k.site_id where s.id = ?';
$result2 = Db::query($sql1, [$value['id']]);
// dump($value['create_time']); //网站即使没有关键词,也需要有创建时间
if (!empty($result2)) {
// 如果状态是已更新,获取所有已更新的临时时间表中的,下一次时间
$now_a = time();
$flutime = $value['flu_count'];
$next_time = strtotime($value['next_time']); //将下一次更新时间转换成时间戳
// $date = date('Y-m-d H:i:s', ($next_time - 60 * 60)); //时间提前一个小时,推后一个小时,测试,进行10个小时之后
// echo $date; //最终确定更新时间,从00:00:00开始,03:00:00结束,中间2个小时的更新时间
if ($next_time-60*60*1 <= $now_a && $next_time + 60 * 60*10 >= $now_a) {
try {
// dump($result2); 获取对应的域名下,所有的关键词
foreach ($result2 as $key2 => $value2) {
$keywords = urlencode($value2['keywords']);
$site = $value2['site'];
// .' 2>&1'
$url = 'python3 ' . BASE_PATH . 'py/test_two.py ' . $keywords . ' ' . $site.' '.$value2['id'];
exec($url, $out);
// dump($out);
if ($out != []) {
// 循环py文件返回的数据,将数据取出
$str = substr($out[0], 2, -2);
$cur_page = floor(((int)$str - 1) / 10) + 1;
$sql2 = 'insert into sem_rank (cur_page,rank,keyword_id,create_time) values(?,?,?,now())';
Db::execute($sql2, [$cur_page, $str, $value2['id']]);
break;
} else {
$sql3 = 'insert into sem_rank (rank,keyword_id,create_time) values (?,?,now())';
Db::execute($sql3, ['100以内,未有排名', $value2['id']]);
}
}
// 网站的关键词排名向数据插入成功后,修改临时表的上一次更新时间,状态,修改成已更新,下一次时间,记录更新时间
$sql3 = 'UPDATE sem_temp SET pre_time = ?,next_time=? WHERE site_id = ?';
// echo $value['next_time'];
// 下一次更新时间 3600 * 24是以分钟来计算的,60*60*24,没有计算毫秒
$next_b = date('Y-m-d H:i:s', (strtotime($value['next_time']) + 3600 * 24 * ($flutime + 1)));
// 将上一次的计算出来的下一次时间,放入临时表中的上一次刷新时间,下一次的刷新时间,按照上一次刷新时间,+天数的毫秒值,写入数据库
Db::execute($sql3, [$value['next_time'], $next_b, $value['id']]);
} catch (Exception $e) {
return json(['code' => 2, 'msg' => '已更新,发生异常']);
}
}
}
// 如果,网站没有对应的关键词,就给出提示
}
else {
// 如果网站还没有对应的关键词,则跳过
continue;
}
}
// 如果所有的网站数据都遍历完成,就返回成功
return json(['code' => 0, 'msg' => '更新完成']);
}
本来打算使用宝塔的定时任务,定时访问php的接口。但是,经过测试,宝塔不能直接访问php接口。这个定时就没有用。但是思路是可以。就保存在这里。不喜勿喷