最新webman框架中使用thinkorm后开启字段缓存不生效的解决方法

uspear

webman最新版本thinkorm后开启字段缓存不生效的解决方法

Workerman version:4.0.37

1、按照文档安装项目

composer create-project workerman/webman

2、先安装think-cache(一定要先安装cache再安装orm)

安装ThinkCache

composer require psr/container ^1.1.1 webman/think-cache

3、安装think-orm(安装完后再修改webman的原文件)

composer -W require psr/container ^1.1.1 webman/think-orm

修改流程

1、确保这里的先后顺序

文件路径:E:\lab\php\webman\webman\config\
截图

2、修改ThinkOrm.php文件

文件路径:E:\lab\php\webman\webman\vendor\webman\think-orm\src\ThinkOrm.php
文件改为这样

<?php
namespace Webman\ThinkOrm;

use Webman\Bootstrap;
use Workerman\Timer;
use think\facade\Db;
use think\facade\Cache;

class ThinkOrm implements Bootstrap
{
    // 进程启动时调用
    public static function start($worker)
    {
        // 配置
        Db::setConfig(config('thinkorm'));
        // 新增 缓存-uspear@qq.com
        Db::setCache(Cache::store());
        // 维持mysql心跳
        if ($worker) {
            Timer::add(55, function () {
                $connections = config('thinkorm.connections', []);
                foreach ($connections as $key => $item) {
                    if ($item['type'] == 'mysql') {
                        Db::connect($key)->query('select 1');
                    }
                }
            });
        }
    }
}

截图

3、修改think-orm源文件

文件路径:E:\lab\php\webman\webman\vendor\topthink\think-orm\src\db\PDOConnection.php

截图

如果不会改,我已经上传gitee,可以直接下载使用

https://gitee.com/uspear/webman-thinkorm-cache.git

187 3 1
3个评论

yzh52521

orm 里增加

Db::setCache(Cache::store());

tp cache 使用
topthink/think-cache 这个扩展用 2.0.x-dev

  • uspear 17天前

    think-cache有修复他的bugs?

  • yzh52521 16天前

    你都有能力改源码了 还不知道 官方有没有改bug?

  • yzh52521 16天前

    官方也是 修复了 也不发版本

Tinywan

哪有这样子玩的呀!

  • uspear 17天前

    大神,请教一下,不知道怎样改,这样改了缓存,不受mysql瓶颈的限制,性能提高了2倍以上

  • Tinywan 17天前

    修改源码就是不可取

  • uspear 16天前

    看来,大佬有更好的方法,坐等更新代码

  • Tinywan 12天前

    就是直接使用框架的缓存即可,本地已经实现PSR16

    thinkorm.php 配置

    Db::setConfig(config('thinkorm'));
    // 开启字段缓存
    Db::setCache(\support\Cache::instance());

    查询缓存

    $res = UserModel::where('id',20220005)
        ->cache('RestyRedis:'.UserModel::getTable())
        ->select();
    var_dump($res->toArray());

    Redis缓存结果

    截图

  • Tinywan 12天前

    如果开启字段缓存 'fields_cache' => true, 缓存数据表结果

    截图

    案例提交参考地址:https://github.com/Tinywan/webman-admin/commit/f616dededcf2dff8818e8f66ab6084722881023e

小阳光
//写个符合psr16的缓存类就完事 
//support\Db::setCache(Container::get(RedisAdapter::class));

  <?php
/**
 * Created by PhpStorm.
 * User: zhang
 * Date: 2020/9/2
 * Time: 20:47
 */

namespace support\bootstrap\db\dbcache;

use Psr\SimpleCache\CacheInterface;
use support\bootstrap\Redis;

//psr16 规范
class RedisAdapter implements CacheInterface
{
    /**
     * 前缀
     * @var string
     */
    private $pre = 'think_cache_';

    /**
     * @return string
     */
    public function __construct($pre = '')
    {
        if ($pre) $this->pre = $pre;
        $this->clear();
    }

    /**
     * 生成key
     * @param $key
     * @return string
     */
    private function addPre($key)
    {
        return $this->pre . $key;
    }

    /**
     * @param string $key
     * @param null $default
     * @return mixed|null
     */
    public function get($key, $default = null)
    {
        try {
            $key = $this->addPre($key);
            #$cache = unserialize(Redis::get($key));
            $cache = json_decode(Redis::get($key), true);
            if (!$cache) return $default;
            return $cache;
        } catch (\Throwable $th) {
            return $default;
        }
    }

    /**
     * @param string $key
     * @param mixed $value
     * @param null $ttl
     * @return bool
     */
    public function set($key, $value, $ttl = null)
    {
        $key = $this->addPre($key);
        try {
            if (is_numeric($ttl)) {
                #return Redis::set($key, serialize($value), 'EX', $ttl);
                return Redis::set($key, json_encode($value), 'EX', $ttl);
            } else {
                #return Redis::set($key, serialize($value));
                return Redis::set($key, json_encode($value));
            }
        } catch (\Throwable $th) {
            return false;
        }
    }

    /**
     * @param string $key
     * @return bool
     */
    public function delete($key)
    {
        $key = $this->addPre($key);
        try {
            Redis::del($key);
        } catch (\Throwable $th) {
            return false;
        }
        return true;
    }

    /**
     * @return bool|int
     */
    public function clear()
    {
        try {
            $keys = Redis::keys("{$this->pre}*");
            return Redis::del($keys);
        } catch (\Throwable $th) {
            return false;
        }
    }

    /**
     * @param iterable $keys
     * @param null $default
     * @return \Generator|iterable
     */
    public function getMultiple($keys, $default = null)
    {
        foreach ($keys as $key) {
            yield $key => $this->get($key, $default);
        }
    }

    /**
     * @param iterable $values
     * @param null $ttl
     * @return bool
     */
    public function setMultiple($values, $ttl = null)
    {
        foreach ($values as $key => $value) {
            if (!$this->set($key, $value, $ttl)) {
                return false;
            }
        }
        return true;
    }

    /**
     * @param iterable $keys
     * @return bool
     */
    public function deleteMultiple($keys)
    {
        foreach ($keys as $key) {
            if (!$this->delete($key)) {
                return false;
            }
        }
        return true;
    }

    /**
     * @param string $key
     * @return bool
     */
    public function has($key)
    {
        try {
            $key = $this->addPre($key);
            return boolval(Redis::exists($key));
        } catch (\Throwable $th) {
            return false;
        }
    }

    public function __destruct()
    {
        $this->clear();
    }
}

uspear

200
积分
0
获赞数
0
粉丝数
23天前 加入
🔝