webman 1.2版本支持think-orm插件,可自动安装think-orm并配置webman。该插件需要webman>=1.2.1,如果你的webman版本是旧版本,请参考以下文档手动配置安装think-orm。
安装ThinkOrm
composer require topthink/think-orm
配置文件 config/thinkorm.php
内容如下:
<?php
return [
'default' => 'mysql',
'connections' => [
'mysql' => [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'test',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '',
// 数据库连接端口
'hostport' => '3306',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => '',
// 断线重连
'break_reconnect' => true,
// 关闭SQL监听日志
'trigger_sql' => false,
],
],
];
建立数据库初始化文件
新建support/bootstrap/ThinkOrm.php
,内容如下:
<?php
namespace support\bootstrap;
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');
}
}
});
}
}
}
进程启动配置
打开config/bootstrap.php
,加入如下配置:
return [
// 这里省略了其它配置 ...
support\bootstrap\ThinkOrm::class,
];
进程启动时会执行一遍
config/bootstrap.php
里配置的类的start方法。我们利用start方法来初始化ThinkORM的配置,业务就直接可以使用ThinkORM了。
使用
<?php
namespace app\controller;
use support\Request;
use think\facade\Db;
class Foo
{
public function get(Request $request)
{
$user = Db::table('user')->where('uid', '>', 1)->find();
return json($user);
}
}
ThinkORM使用文档
是要替换默认的 Laravel Eloquent ORM 为 ThinkORM 吗?
没有这个意思,只是方便thinkorm的安装。
好的,明白了
好用!给你点赞!
谢谢博主分享,点赞一下
单库和一主一从可以用,但是我今天恰好遇到了一个问题
我是4个数据库,2主,2从架构
数据量较大,可能会存在这个情况
因为webman启动后,orm常驻内存,所以用过之后就不会销毁,那么问题来了,
当使用think-orm的模型进行增删改查的操作室,这个$this->linkWrite和$this->linkRead,除了第一次没有值,之后永远有值,不管后面是第几个请求过来,这个时候数据库架构就变成了 1主1从,因为是常驻内存,另外一个主和另外一个从没有机会参与选取,
我也试着让他参数选取“自定义”的一个参数master_election,让程序在执行mysql操作的时候,在两个主库之间进行二选一
事实证明是可行的,可以随机在两个主库当中选择一个
但是问题又来了,
假如A用户在执行事务操作,那么这个时候,读写都应该是在一个主库进行(因为数据量一大有很大几率卡主从),A将master_election(自定义的一个参数)设置为false ,因为是常驻内存,与此同时B用户设置master_election(自定义的一个参数)为 true,这个时候就存在B用户污染了A用户,导致A在主库1执行了新增操作,由于数据量大,卡了一下主从,A在读取时两个master进行选举,选到了主库2,查询没有数据,事务失败
想请教一下楼主怎么解决这个的思路是什么,(有一种办法是一直传参数,从最上层传到最底层,但是不现实)
解决了
能说下是怎么解决的吗