首先什么是静态化API?
答:静态化API
相当于把我们之前首页的数据转成json
格式的字符串进行存储。
系统的瓶颈点一般是在mysql
这一层,每次来一个用户都会去查询一遍mysql
.这样用户一多.我们的mysql
可能就会面临一些性能问题.为了缓解性能的压力.采用静态API
.当用户来了我们直接读取我们生成好的json
数据.这样就能提升性能呢.对于静态化API
我目前有两种办法通过EasySwoole+crontab
生成.EasySwoole定时器
.先来结合文档中的示例代码读一读官方源码的crontab
首先官方文档的调用
use EasySwoole\EasySwoole\Crontab\Crontab;
...
public static function mainServerCreate(EventRegister $register)
{
// TODO: Implement mainServerCreate() method.
/**
* **************** Crontab任务计划 **********************
*/
// 开始一个定时任务计划
Crontab::getInstance()->addTask(TaskOne::class);
// 开始一个定时任务计划
Crontab::getInstance()->addTask(TaskTwo::class);
}
可以看到调用了两个Task任务
.在APP
目录下创建Crontab
目录进入创建TaskOne.php
namespace App\Crontab;
use EasySwoole\EasySwoole\Crontab\AbstractCronTask;
class TaskOne extends AbstractCronTask
{
public static function getRule(): string
{
// TODO: Implement getRule() method.
// 定时周期 (每分钟)
return '@minute';
}
public static function getTaskName(): string
{
// TODO: Implement getTaskName() method.
// 定时任务名称
return 'taskOne';
}
static function run(\swoole_server $server, int $taskId, int $fromWorkerId, $flags = null)
{
// TODO: Implement run() method.
// 定时任务处理逻辑
var_dump('run once per hour');
}
}
创建TaskTwo.php
namespace App\Crontab;
use EasySwoole\EasySwoole\Crontab\AbstractCronTask;
class TaskTwo extends AbstractCronTask
{
public static function getRule(): string
{
// TODO: Implement getRule() method.
// 定时周期 (每两分钟一次)
return '*/2 * * * *';
}
public static function getTaskName(): string
{
// TODO: Implement getTaskName() method.
// 定时任务名称
return 'taskTwo';
}
static function run(\swoole_server $server, int $taskId, int $fromWorkerId,$flags=null)
{
// TODO: Implement run() method.
// 定时任务处理逻辑
var_dump('run once every two minutes');
}
}
可以看到这两个类都继承了EasySwoole\EasySwoole\Crontab\AbstractCronTask
文件位置vendor\easyswoole\easyswoole\src\Crontab\AbstractCronTask.php
namespace EasySwoole\EasySwoole\Crontab;
use EasySwoole\EasySwoole\Swoole\Task\QuickTaskInterface;
abstract class AbstractCronTask implements QuickTaskInterface
{
abstract public static function getRule():string ;
abstract public static function getTaskName():string ;
}
因为是抽象类的抽象方法所以在继承的时候必须要声明.在看下同级目录下的Crontab.php
/*
* 同名任务会被覆盖
*/
function addTask(string $cronTaskClass): Crontab
{
try {
$ref = new \ReflectionClass($cronTaskClass);
if ($ref->isSubclassOf(AbstractCronTask::class)) {
$taskName = $cronTaskClass::getTaskName();
$taskRule = $cronTaskClass::getRule();
if (CronExpression::isValidExpression($taskRule)) {
$this->tasks[$taskName] = $cronTaskClass;
} else {
throw new CronTaskRuleInvalid($taskName, $taskRule);
}
return $this;
} else {
throw new \InvalidArgumentException("the cron task class {$cronTaskClass} is invalid");
}
} catch (\Throwable $throwable) {
throw new \InvalidArgumentException("the cron task class {$cronTaskClass} is invalid");
}
}
isSubclassOf
会去调用factory
方法.可以看到没有我们TaskOne
每分钟的写法.可以自己添加哈.crontab命令
.删掉TaskOne
.给TaskTwo
重命名为TaskOne
public static function factory($expression, FieldFactory $fieldFactory = null)
{
$mappings = array(
'@yearly' => '0 0 1 1 *',
'@annually' => '0 0 1 1 *',
'@monthly' => '0 0 1 * *',
'@weekly' => '0 0 * * 0',
'@daily' => '0 0 * * *',
'@hourly' => '0 * * * *'
);
if (isset($mappings[$expression])) {
$expression = $mappings[$expression];
}
return new static($expression, $fieldFactory ?: new FieldFactory());
}
Crontab
参数
crontab参数
* * * * *
- - - - -
| | | | |
| | | | |
| | | | +----- day of week (0 - 7) (Sunday=0 or 7)
| | | +---------- month (1 - 12)
| | +--------------- day of month (1 - 31)
| +-------------------- hour (0 - 23)
+------------------------- min (0 - 59)
在EasySwooleEvent.php
添加
use App\Crontab\TaskOne;
为了不让方法看着过于臃肿进行拆分
/*主服务创建事件*/
public static function mainServerCreate(EventRegister $register)
{
// TODO: Implement mainServerCreate() method.
/*Di注入数据库设置*/
self::setDb();
/*执行异步任务*/
self::Consumer();
/*通过crontab执行task任务*/
self::CrontabTask();
}
/*执行crontabTask任务*/
static public function CrontabTask()
{
Crontab::getInstance()->addTask(TaskOne::class);
}
回到TaskOne
把对应的名字和返回的内容改一下吧
class TaskOne extends AbstractCronTask
{
public static function getRule(): string
{
// TODO: Implement getRule() method.
// 定时周期 (每两分钟一次)
return '*/1 * * * *';
}
public static function getTaskName(): string
{
// TODO: Implement getTaskName() method.
// 定时任务名称
return 'TaskOne';
}
static function run(\swoole_server $server, int $taskId, int $fromWorkerId,$flags=null)
{
// TODO: Implement run() method.
// 定时任务处理逻辑
var_dump('taskOne:1' . PHP_EOL);
}
}
在EasySwooleEvent.php
中直接调用测试
/*执行crontabTask任务*/
static public function CrontabTask()
{
Crontab::getInstance()->addTask(TaskOne::class);
}
重启测试
等待时间还挺长的哈.不过也是没有问题的