通过EasySwoole
+ Crontab
来实现定时写文件的静态化API
方案.对于没用过定时任务的小伙伴们听起来感觉一定很牛逼吧!就算我echo 1;
你们也要觉得我牛逼哦~
首先来看看官方文档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;
}
}
}
大魔王,怎么登录呢?
评论填写信息发表评论就算登录了