什么是静态化API?
静态化API可以理解成把一些接口的数据存储在服务器本地。常用的是存成json文件,也可以是放在swoole的table中,总之是用户不从数据库直接读取数据,而是从本地加载的方式来大幅提高性能,因为很多系统的性能瓶颈是在数据库的位置。
解决方案
- 方案1 easySwoole + crontab
- 方案2 easySwoole定时器
- 方案3 Swoole table
- 方案4 Redis
实现
这里做的分页的场景,不包含分页的源码,只从拿到了分页的数据看看定时生成json和获取json的部分
原始的方法 – 读取mysql
这是原始的方法,每个用户访问都会去数据库里面读取一次,每一次分页也会访问数据库,会造成大量的资源开销。
public function lists0(){
$condition = [];
if(!empty($this->params['cat_id'])){
$condition['cat_id'] = intval($this->params['cat_id']);
}
try {
$videoModel = new VideoModel();
$data = $videoModel->getVideoData($condition, $this->params['page'], $this->params['size']);
} catch (\Exception $e) {
//$e->getMessage();
return $this->writeJson(Status::CODE_BAD_REQUEST,"服务异常");
}
if(!empty($data['lists'])){
foreach ($data['lists'] as &$list){
$list['create_time'] = date("Ymd H:i:s",$list['create_time']);
$list['video_duration'] = gmstrftime("%H:%M:%S",$list["video_duration"]);
}
}
return $this->writeJson(Status::CODE_OK,'OK',$data);
}
知识点:
1 获取以秒飞单位的时间长度使用gmstrftime(“%H:%M:%S”,$list[“video_duration”])
2 在做模型的时候写一个基类,把连接数据库的工作放在这个基类的构造方法当中,这样每次实例化的时候就自动连接了,提高代码的复用性
<?php
/**
* Created by bingxiong.
* Date: 12/23/19
* Time: 1:20 AM
* Description:
*/
namespace App\Model;
use EasySwoole\Core\Component\Di;
class Base
{
public $db = "";
public function __construct()
{
if(empty($this->tableName)){
throw new \Exception("table error");
}
$db = Di::getInstance()->get("MYSQL");
if($db instanceof \MysqliDb){
$this->db = $db;
}else{
throw new \Exception("db error");
}
}
public function add($data){
if(empty($data) || !is_array($data)){
return false;
}
return $this->db->insert($this->tableName,$data);
}
}
方案一、方案二 使用easySwoole定时器以及contab的生成静态化API
这是直接读取静态化API的方法,其实就是读文件然后返回给前端
/**
* 第二套方法 - 直接读取静态化json数据
* @return bool
*/
public function lists(){
$catId = !empty($this->params['cat_id']) ? intval($this->params['cat_id']) : 0;
$videoFile = EASYSWOOLE_ROOT."/webroot/video/json/".$catId.