Laravel 7使用Http Client同步api数据到数据库-定时任务

测试Api 来自https://api.qq.jsososo.com/ 是个开源项目

安装http

composer require guzzlehttp/guzzle
php artisan make:command SendEmails
    public function handle()
    {
        //循环补齐url
        for ($i = 1; $i < 9999; $i++) {
            $u[$i] = 'http://123.207.228.46:3300/singer/list?pageNo=' . $i;
        }
        //url循环赋给HTTP
        foreach ($u as $k => $item) {
            $res = Http::get($item);
            //得到的数据循环处理
            foreach ($res->json()['data']['list'] as $key => $value) {
                //查找数据库中singer_id如果有不操作没有就创建
                if (Singer::where('singer_id', $value['singer_id'])->get()->isEmpty()) {
                    try {
                        $id = Singer::create($value);
                        $this->info(now() . "-----第{$k}个URL-----{$key}----增加后的数据库id-{$id->id}");
                    } catch (QueryException $e) {
                        //如果有错误就不打印了
                        //$e->getMessage();
                    }
                } else {
                    $this->info("第{$k}个URL中的第{$key}条数据已经存在,无操作");
                }

            }
        }
        $this->info('全部任务完成');
    }

定时任务我之前一直使用宝塔的今天写一下如何通过laravel

Laravel 框架也提供了调度机制,和 服务器的 crontab 结合,可以实现任务定时执行。

首先编辑 app/Console/Kernel.php 文件的 schedule() 函数:

protected function schedule(Schedule $schedule)
  {
    $schedule->command('test')->dailyAt('12:35');
    $schedule->command('spider:joke')
      ->dailyAt('0:03');
    $schedule->command('spider:image')
      ->dailyAt('0:03');
  }
$schedule->command('spider:joke')->dailyAt('0:03');

另外要注意一下服务器上 php 时区的配置,如果和你期望的不一致,执行实际也会不对。

最后,编辑服务器的 crontab,命令行输入:

crontab -e

添加下面内容:

* * * * * /usr/local/php71/bin/php /data/wwwroot/default/test/jokes/artisan schedule:run 1>> /dev/null 2>&1

其中第一段为你自己服务器的 php 路径。

这样就完成了一个每天定时更新数据库的功能