【PHP】用Swoole实现四种高性能静态API方案

什么是静态化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 在做模型的时候写一个基类,把连接数据库的工作放在这个基类的构造方法当中,这样每次实例化的时候就自动连接了,提高代码的复用性


/**
 * 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.

你可能感兴趣的:(进阶PHP月薪30k,php,swoole,高性能,api)