首先什么是静态化API?
  答:静态化API相当于把我们之前首页的数据转成json格式的字符串进行存储。

  系统的瓶颈点一般是在mysql这一层,每次来一个用户都会去查询一遍mysql.这样用户一多.我们的mysql可能就会面临一些性能问题.为了缓解性能的压力.采用静态API.当用户来了我们直接读取我们生成好的json数据.这样就能提升性能呢.50.gif对于静态化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);
}

重启测试
image.png
等待时间还挺长的哈.不过也是没有问题的23.png

Last modification:February 18th, 2020 at 10:30 pm