php调用python脚本实现定时刷新

  /*
     * 方案二
     *  按照当前的时间,不论当前时间是几点,都算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接口。这个定时就没有用。但是思路是可以。就保存在这里。不喜勿喷

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值