>  기사  >  PHP 프레임워크  >  ThinkPHP6에서 데이터베이스 수평 하위 데이터베이스 작업을 수행하는 방법은 무엇입니까?

ThinkPHP6에서 데이터베이스 수평 하위 데이터베이스 작업을 수행하는 방법은 무엇입니까?

WBOY
WBOY원래의
2023-06-12 11:39:161917검색

비즈니스 규모가 확장됨에 따라 데이터베이스가 처리해야 하는 데이터의 양도 증가하여 단일 데이터베이스에 대한 부담이 커지고 있습니다. 이때 우리는 데이터베이스 수평 하위 데이터베이스 작업을 수행하여 데이터를 여러 데이터베이스에 분산시켜 시스템의 성능과 확장성을 향상시켜야 합니다. 이 기사에서는 ThinkPHP6에서 데이터베이스 수평 샤딩 작업을 수행하는 방법을 소개합니다.

1. 데이터베이스 수평형 하위 데이터베이스란?

데이터베이스 수평 샤딩은 하나의 데이터베이스에 있는 데이터를 여러 데이터베이스로 분산시키는 프로세스입니다. 특정 규칙(예: 사용자 ID 또는 기간)에 따라 데이터를 여러 데이터베이스로 나눌 수 있으므로 단일 데이터베이스에 대한 로드 압력을 줄일 수 있습니다. 동시에 데이터 양이 많은 경우 수평 샤딩을 통해 쿼리 효율성을 높이고 데이터 보안을 강화할 수도 있습니다.

2. ThinkPHP6에서 수평 하위 라이브러리 구현

ThinkPHP6에서는 데이터베이스 미들웨어를 사용하여 수평 하위 라이브러리를 구현할 수 있습니다. 하위 데이터베이스를 제어하려면 ThinkPHP6의 MySQL 연결에 데이터베이스 미들웨어를 배치하세요.

  1. Thinkswoole 설치

ThinkPHP6에서는 Thinkswoole이 데이터베이스 미들웨어로 사용됩니다. 프로젝트에 Thinkswoole을 설치해야 합니다.

composer.json 파일에 ThinkSwoole 버전 정보를 추가한 뒤, 작곡가를 이용해 설치하세요.

  1. 데이터베이스 구성 수정

먼저 config/database.php 파일을 찾아 MySQL 연결을 Swoole 연결로 바꿉니다. 원본 MySQL 연결 정보 주석 처리:

// 'mysql' => [
    //     // 默认数据连接标识
    //     'default' => env('database.driver', 'mysql'),
    //     // 数据库连接信息
    //     'connections' => [
    //         'mysql' => [
    //             // 数据库类型
    //             'type' => 'mysql',
    //             // 主机地址
    //             'host' => env('database.hostname', '127.0.0.1'),
    //             // 数据库名
    //             'database' => env('database.database', ''),
    //             // 用户名
    //             'username' => env('database.username', 'root'),
    //             // 密码
    //             'password' => env('database.password', ''),
    //             // 端口
    //             'hostport' => env('database.hostport', '3306'),
    //             // 数据库连接参数
    //             'params' => [],
    //             // 数据库编码默认采用utf8
    //             'charset' => 'utf8',
    //             // 数据库表前缀
    //             'prefix' => env('database.prefix', ''),
    //             // 数据库调试模式
    //             'debug' => env('database.debug', true),
    //             // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
    //             'deploy' => 0,
    //             // 数据库读写是否分离 主从式有效
    //             'rw_separate' => false,
    //             // 读写分离后 主服务器数量
    //             'master_num' => 1,
    //             // 指定从服务器序号
    //             'slave_no' => '',
    //             // 是否严格检查字段是否存在
    //             'fields_strict' => true,
    //             // 数据集返回类型
    //             'resultset_type' => 'array',
    //             // 自动写入时间戳字段
    //             'auto_timestamp' => false,
    //             // 时间字段取出后的默认时间格式
    //             'datetime_format' => false,
    //             // Builder类
    //             'builder' => '',
    //             // Query类
    //             'query' => '\think\db\Query',
    //             // 是否需要进行SQL性能分析
    //             'sql_explain' => false,
    //         ],
    //     ],
    // ],

Swoole 연결 정보 추가:

 // swoole
    'swoole' => [
        // 默认数据连接标识
        'default' => 'swoole',
        // 数据库连接信息
        'connections' => [
            'swoole' => [
                // 数据库类型
                'type' => 'mysql',
                // 服务器地址
                'hostname' => [
                    '127.0.0.1:3305',
                    '127.0.0.1:3306',
                ],
                // 数据库名
                'database' => 'test',
                // 用户名
                'username' => 'root',
                // 密码
                'password' => '',
                // 端口
                'hostport' => '',
                // 数据库连接参数
                'params' => [],
                // 数据库编码默认采用utf8mb4
                'charset' => 'utf8mb4',
                // 数据库表前缀
                'prefix' => '',
                // 数据库调试模式
                'debug' => true,
                // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
                'deploy' => 0,
                // 数据库读写是否分离 主从式有效
                'rw_separate' => false,
                // 读写分离后 主服务器数量
                'master_num' => 1,
                // 指定从服务器序号
                'slave_no' => '',
                // 自动写入时间戳字段
                'auto_timestamp' => false,
                // 时间字段取出后的默认时间格式
                'datetime_format' => 'Y-m-d H:i:s',
                // Builder类
                'builder' => '',
                // Query类
                'query' => '\think\db\Query',
                // 是否需要进行SQL性能分析
                'sql_explain' => false,
            ],
        ],
    ],

위 코드에서는 다중 데이터를 구현하기 위해 두 개의 서버 주소(127.0.0.1:3305 및 127.0.0.1:3306)를 정의했습니다. 노드의 하위 라이브러리입니다. 데이터베이스 이름, 사용자 이름, 비밀번호 및 기타 정보는 변경되지 않습니다.

  1. 데이터베이스 미들웨어 생성

app/middleware 디렉토리에 Db.php의 데이터베이스 미들웨어를 생성하고 다음 코드를 추가합니다.

<?php
namespace appmiddleware;

use thinkRequest;
use thinkContainer;

class Db
{
    public function handle(Request $request, Closure $next)
    {
        $serverIds = $this->getServerIds($request);
        //定义一个连接池
        $conns = [];
        foreach($serverIds as $sid) {
            $sid = $request->$sid;
            if(empty($conns[$sid])) {
                $conns[$sid] = Container::getInstance()
                                         ->make('db')->connect($sid);
            }
        }
        Container::getInstance()->bind('db', function() use ($conns) {
            return $conns;
        });
        return $next($request);
    }

    protected function getServerIds(Request $request)
    {
        return ['uid'];
    }
}

여기서 Db라는 미들웨어가 생성됩니다. 핸들 메소드에서는 먼저 현재 요청의 서버 ID 배열을 얻습니다. 그런 다음 이 서버 주소를 연결 풀 $cons의 기존 주소와 비교합니다. 존재하지 않으면 연결 풀에 추가합니다. 마지막으로 연결 풀 $conns를 컨테이너 인스턴스에 바인딩합니다. getServerIds 메소드에서 서버 ID의 이름을 설정할 수 있으며 기본값은 uid입니다.

  1. 미들웨어 등록

config/middleware.php에 다음 코드를 추가하세요.

return [
    ...
    appmiddlewareDb::class,
];

이 코드는 미들웨어를 등록하고 Db 미들웨어를 미들웨어 실행 활동 목록에 추가하는 데 사용됩니다.

  1. 하위 라이브러리 연산 구현

다음으로 모델에서 수평 하위 라이브러리 연산을 구현해 보겠습니다. 여기서는 사용자 테이블을 예로 들어보겠습니다. 사용자 ID는 데이터베이스의 한계로 100,000과 100,000으로 구분됩니다. 이는 사용자 ID가 0에서 100,000 사이인 데이터가 사용자가 도달할 때까지 데이터베이스에 저장된다는 의미입니다. ID는 90만~100만개 사이의 데이터가 10번째 데이터베이스에 저장된다.

<?php
namespace appmodel;

use thinkModel;

class User extends Model
{
    protected $connection = [
        1 => 'user_1',
        2 => 'user_2',
        3 => 'user_3',
        4 => 'user_4',
        5 => 'user_5',
        6 => 'user_6',
        7 => 'user_7',
        8 => 'user_8',
        9 => 'user_9',
        10 => 'user_10',
    ];

    protected $pk = 'uid';

    public function getTableName(): string
    {
        $id = ceil($this->id / 100000);
        return $this->connection[$id] . '.' . $this->table;
    }
}

여기에서는 10개의 데이터베이스 연결을 정의합니다. 각 연결은 데이터베이스 샤드를 나타내며 수평 샤딩의 목적을 달성합니다. 그런 다음 getTableName 메소드를 정의하여 현재 모델에 해당하는 데이터 테이블 이름을 얻습니다. 모델의 기본 키 ID 값을 기준으로 접근해야 하는 데이터베이스 연결을 계산하고, 데이터베이스 연결과 데이터 테이블 이름의 조합을 반환합니다.

요약:

이 글에서는 ThinkPHP6의 수평 하위 라이브러리 작업을 소개합니다. 비즈니스가 지속적으로 확장되고 데이터 규모가 증가함에 따라 수평 샤딩은 시스템 성능과 확장성을 향상하고 데이터 보안을 강화할 수 있습니다. ThinkPHP6에서는 Thinkswoole 미들웨어 및 기타 방법을 사용하여 수평 하위 라이브러리 작업을 구현할 수 있습니다.

위 내용은 ThinkPHP6에서 데이터베이스 수평 하위 데이터베이스 작업을 수행하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.