【问题反馈】think-orm定时器

lxping2

建议ThinkOrm.php中的定时器,增加对配置项“default”限制。

否则,如果设置'default' => 'mongo',只能注释掉mysql配置项,不然会报错。

======================= 问题更新 ==========================

think-orm的配置文件如下(代码二)所示,数据库默认采用mongo,此时,并未使用到mysql,所以mysql的配置项不一定是正确的,但又不想注释或删掉mysql配置。而ThinkOrm.php并未判断当前默认使用的是哪个数据库,导致只要有mysql配置项就去连接。

建议将/vendor/webman/think-orm/src/ThinkOrm.php里代码改成如下(代码一)所示

代码一

<?php
namespace Webman\ThinkOrm;

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

class ThinkOrm implements Bootstrap
{
    // 进程启动时调用
    public static function start($worker)
    {
        // 配置
        Db::setConfig(config('thinkorm'));
        // 维持mysql心跳
        if ($worker) {
            Timer::add(55, function () {
                $default = config('thinkorm.default', '');
                $connections = config('thinkorm.connections', []);
                if($connections[$default]['type'] == 'mysql') {
                    Db::connect($default)->query('select 1');
                }
            });
        }
    }
}

代码二

<?php

return [
    'default' => 'mongo',
    'connections' => [
        'mysql' => [
            // 数据库类型
            'type' => 'mysql',
            // 服务器地址
            'hostname' => '127.0.0.1',
            // 数据库名
            'database' => 'test',
            // 数据库用户名
            'username' => 'root',
            // 数据库密码
            'password' => '123456',
            // 数据库连接端口
            'hostport' => '3306',
            // 数据库连接参数
            'params' => [],
            // 数据库编码默认采用utf8
            'charset' => 'utf8',
            // 数据库表前缀
            'prefix' => '',
            // 断线重连
            'break_reconnect' => true,
            // 关闭SQL监听日志
            'trigger_sql' => false,
        ],

        'mongo' => [
            // 数据库类型
            'type'            => 'mongo',
            // 服务器地址
            'hostname'        => '127.0.0.1',
            // 数据库名
            'database'        => 'test',
            // 是否是复制集
            'is_replica_set'  => false,
            // 用户名
            'username'        => '',
            // 密码
            'password'        => '',
            // 端口
            'hostport'        => '27017',
            // 连接dsn
            'dsn'             => '',
            // 数据库连接参数
            'params'          => [],
            // 数据库编码默认采用utf8
            'charset'         => 'utf8',
            // 主键名
            'pk'              => '_id',
            // 主键类型
            'pk_type'         => 'ObjectID',
            // 数据库表前缀
            'prefix'          => 'my_',
            // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
            'deploy'          => 0,
            // 数据库读写是否分离 主从式有效
            'rw_separate'     => false,
            // 读写分离后 主服务器数量
            'master_num'      => 1,
            // 指定从服务器序号
            'slave_no'        => '',
            // 是否严格检查字段是否存在
            'fields_strict'   => false,
            // 开启字段缓存
            'fields_cache'    => false,
            // 监听SQL
            'trigger_sql'     => true,
            // 自动写入时间戳字段
            'auto_timestamp'  => false,
            // 时间字段取出后的默认时间格式
            'datetime_format' => 'Y-m-d H:i:s',
            // 是否_id转换为id
            'pk_convert_id'   => true,
            // typeMap
            'type_map'        => ['root' => 'array', 'document' => 'array'],
        ],
    ],
];
733 2 0
2个回答

walkor

没看明白你说的是什么问题,你说的 “增加对配置项“default”限制” 是在哪个文件哪个位置加?报错是具体什么报错?

webman/think-orm有个定时器定时发送心跳用来mysql连接,文件为 https://github.com/webman-php/think-orm/blob/main/src/ThinkOrm.php ,内容如下

<?php
namespace Webman\ThinkOrm;

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

class ThinkOrm implements Bootstrap
{
    // 进程启动时调用
    public static function start($worker)
    {
        // 配置
        Db::setConfig(config('thinkorm'));
        // 维持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');
                    }
                }
            });
        }
    }
}
walkor

通过 thinkorm.default 判断类型不严谨,不用的数据库配置注释掉吧

  • 暂无评论
年代过于久远,无法发表回答
🔝