通过EasySwoole + Crontab来实现定时写文件的静态化API方案.对于没用过定时任务的小伙伴们听起来感觉一定很牛逼吧!就算我echo 1;你们也要觉得我牛逼哦~34.gif
首先来看看官方文档3.x的用法

public static function mainServerCreate(EventRegister $register)
{
    // TODO: Implement mainServerCreate() method.
    /**
     * **************** Crontab任务计划 **********************
     */
    // 开始一个定时任务计划 
    Crontab::getInstance()->addTask(TaskOne::class);
    // 开始一个定时任务计划 
    Crontab::getInstance()->addTask(TaskTwo::class);
}

感觉好像有点点变化.看一下2.x的用法

public static function mainServerCreate(ServerManager $server,EventRegister $register): void
{
    // TODO: Implement mainServerCreate() method.
    CronTab::getInstance()->addRule('test1','@daily',function (){
        var_dump('run only once every daty');
    })->addRule('test2','*/1 * * * *',function (){
        var_dump('run per min at'.time());
    })->addRule('test3','*/2 * * * *',function (){
        var_dump('run per 2min at'.time());
    });
}

之前直接写传方法就行来.现在要注册一个类传过去,Tmd

App\Crontab目录下创建IndexVideo.php

namespace App\Crontab;

use EasySwoole\EasySwoole\Crontab\AbstractCronTask;

class IndexVideo extends AbstractCronTask
{

    public static function getRule(): string
    {
        // TODO: Implement getRule() method.
        // 定时周期 (每分钟一次)
        return '*/1 * * * *';
    }

    public static function getTaskName($name = ''): string
    {
        // TODO: Implement getTaskName() method.
        // 定时任务名称
//        return self::$name;
        return 'SetIndexVideo';
    }

    static function run(\swoole_server $server, int $taskId, int $fromWorkerId, $flags = null)
    {
        // TODO: Implement run() method.
        // 定时任务处理逻辑
        $catIds = array_keys(\Yaconf::get('navigation.cat'));
        array_unshift($catIds,0);
        print_r($catIds);
    }
}

打印$catIds.查看结果.

Array
(
    [0] => 0
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 4
    [5] => 5
)

获取到了栏目的id.接下来应该通过循环的方式获取每一个栏目的视频内容.
  像一个大型的门户网站.一个栏目可能有几亿条,几十亿条的数据.他们不会把所有的数据都呈现出来.分页的话如果每夜显示10条.那也会有几千万的页吧.你可以看看哪个网站这么牛逼...能把所有的页数可你显示出来.这么多页如果它点的中间或往后一点.mysql会很耗资源的.我们可以先展示给他1000条.
App\Model\Video.php新增生成1000条数据的方法.用于生成缓存文件.

/*
 * 设置缓存数据
 * 默认1000条.
 * 页数肯定就是1.
 * */
public function setVideoData($condition = [], $size = 1000)
{
    $page = 1;
    if (!empty($size)) {
        $this->db->pageLimit = $size;
    }
    if (!empty($condition['cat_id'])) {
        $this->db->where('cat_id', $condition['cat_id']);
    }
    $this->db->where('status', ['>=' => 1]);
    $this->db->orderBy('id', 'desc');
    $data = $this->db->arrayBuilder()->paginate($this->tableName, $page);
    //echo $this->db->getLastQuery();
    return $data;
}

回到App\Crontab\IndexVideo.php修改

use App\Model\Video as VideoModel;
static function run(\swoole_server $server, int $taskId, int $fromWorkerId, $flags = null)
{
    // TODO: Implement run() method.
    // 定时任务处理逻辑
    // 获取配置文件中的栏目Id.因为不是从0开始的.在开始追加个0
    $catIds = array_keys(\Yaconf::get('navigation.cat'));
    array_unshift($catIds, 0);
    // 使用Model里的对每个不同栏目Id默认生成默认1000条的方法.
    $videoModel = new VideoModel();
    foreach ($catIds as $catId) {
        $condition = [];
        if (!empty($catIds)) {
            $condition['cat_id'] = $catId;
        }
        try {
            $data = $videoModel->setVideoData($condition);
        } catch (\Exception $e) {
            $data = [];
        }
        // 如果某个栏目id查询的结果为空.跳出本次循环
        if (empty($data)) {
            continue;
        }
        
    }

}

接下来就该对数据进行处理.就是我们在返回首页数据的时候对时间格式进行处理的逻辑.

foreach ($data['lists'] as &$val){
    $val['create_time'] = date('Y-m-d H:i:s');
    $val['update_time'] = date('Y-m-d H:i:s');
    $val['video_duration'] = gmstrftime("%H:%I:%S",$val['video_duration']);
}

App\Crontab\IndexVideo.php稍作修改进行应用

static function run(\swoole_server $server, int $taskId, int $fromWorkerId, $flags = null)
{
    // TODO: Implement run() method.
    // 定时任务处理逻辑
    // 获取配置文件中的栏目Id.因为不是从0开始的.在开始追加个0
    $catIds = array_keys(\Yaconf::get('navigation.cat'));
    array_unshift($catIds, 0);
    // 使用Model里的对每个不同栏目Id默认生成默认1000条的方法.
    $videoModel = new VideoModel();
    foreach ($catIds as $catId) {
        $condition = [];
        if (!empty($catIds)) {
            $condition['cat_id'] = $catId;
        }
        try {
            $data = $videoModel->setVideoData($condition);
        } catch (\Exception $e) {
            $data = [];
        }
        // 如果某个栏目id查询的结果为空.跳出本次循环
        if (empty($data)) {
            continue;
        }
        foreach ($data as &$val) {
            $val['create_time'] = date('Y-m-d H:i:s');
            $val['update_time'] = date('Y-m-d H:i:s');
            $val['video_duration'] = gmstrftime("%H:%I:%S", $val['video_duration']);
        }
        var_dump($data);
    }
}

测试成功将数据写入到json文件中.添加

$dir = EASYSWOOLE_ROOT . '/website/video/json';
if (!is_dir($dir)) {
    mkdir($dir, 0777);
}
$flag = file_put_contents($dir . '/video_' . $catId . '.json', json_encode($data));
if (empty($flag)) {
    // 日志 短信 邮件报警
    echo 'cat_id' . $catId . 'put data error' . PHP_EOL;
} else {
    echo 'cat_id' . $catId . 'put data success' . PHP_EOL;
}

测试成功,App\Crontab\IndexVideo.php完整代码

static function run(\swoole_server $server, int $taskId, int $fromWorkerId, $flags = null)
{
    // TODO: Implement run() method.
    // 定时任务处理逻辑
    // 获取配置文件中的栏目Id.因为不是从0开始的.在开始追加个0
    $catIds = array_keys(\Yaconf::get('navigation.cat'));
    array_unshift($catIds, 0);
    // 使用Model里的对每个不同栏目Id默认生成默认1000条的方法.
    $videoModel = new VideoModel();
    foreach ($catIds as $catId) {
        $condition = [];
        if (!empty($catId)) {
            $condition['cat_id'] = $catId;
        }
        try {
            $data = $videoModel->setVideoData($condition);
        } catch (\Exception $e) {
            // 日志 短信 邮件报警
            $data = [];
        }
        // 如果某个栏目id查询的结果为空.跳出本次循环
        if (empty($data)) {
            continue;
        }
        foreach ($data as &$val) {
            $val['create_time'] = date('Y-m-d H:i:s');
            $val['update_time'] = date('Y-m-d H:i:s');
            $val['video_duration'] = gmstrftime("%H:%I:%S", $val['video_duration']);
        }
        $dir = EASYSWOOLE_ROOT . '/website/video/json';
        if (!is_dir($dir)) {
            mkdir($dir, 0777);
        }
        $flag = file_put_contents($dir . '/video_' . $catId . '.json', json_encode($data));
        if (empty($flag)) {
            // 日志 短信 邮件报警
            echo 'cat_id' . $catId . 'put data error' . PHP_EOL;
        } else {
            echo 'cat_id' . $catId . 'put data success' . PHP_EOL;
        }
    }
}
Last modification:February 18th, 2020 at 10:30 pm