Rumah  >  Artikel  >  rangka kerja php  >  Bagaimana untuk melaksanakan operasi sub-pangkalan data mendatar pangkalan data dalam ThinkPHP6?

Bagaimana untuk melaksanakan operasi sub-pangkalan data mendatar pangkalan data dalam ThinkPHP6?

WBOY
WBOYasal
2023-06-12 11:39:161917semak imbas

Dengan pengembangan skala perniagaan, jumlah data yang perlu diproses oleh pangkalan data juga semakin meningkat, menyebabkan satu pangkalan data menghadapi tekanan. Pada masa ini, kami perlu melaksanakan operasi sub-pangkalan data mendatar pangkalan data untuk menyebarkan data ke dalam pangkalan data yang berbeza, dengan itu meningkatkan prestasi dan kebolehskalaan sistem. Artikel ini akan memperkenalkan cara untuk melaksanakan operasi pemecahan mendatar pangkalan data dalam ThinkPHP6.

1. Apakah sub-pangkalan data mendatar pangkalan data?

Pecahan mendatar pangkalan data ialah proses penyebaran data dalam satu pangkalan data kepada berbilang pangkalan data. Kami boleh membahagikan data kepada pangkalan data yang berbeza mengikut peraturan tertentu (seperti mengikut ID pengguna atau tempoh masa), dengan itu mengurangkan tekanan beban pada satu pangkalan data. Pada masa yang sama, apabila jumlah data adalah besar, sharding mendatar juga boleh meningkatkan kecekapan pertanyaan dan meningkatkan keselamatan data.

2. Pelaksanaan sub-pustaka mendatar dalam ThinkPHP6

Dalam ThinkPHP6, kita boleh melaksanakan sub-pustaka mendatar dengan menggunakan perisian tengah pangkalan data. Letakkan perisian tengah pangkalan data dalam sambungan MySQL ThinkPHP6 untuk mengawal sub-pangkalan data.

  1. Pasang Thinkswoole

Dalam ThinkPHP6, Thinkswoole digunakan sebagai perisian tengah pangkalan data. Kita perlu memasang Thinkswoole dalam projek.

Tambahkan maklumat versi ThinkSwoole pada fail composer.json, dan kemudian gunakan komposer untuk memasangnya.

  1. Ubah suai konfigurasi pangkalan data

Mula-mula cari fail config/database.php dan gantikan sambungan MySQL dengan sambungan Swoole. Komen maklumat sambungan MySQL asal:

// '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,
    //         ],
    //     ],
    // ],

Tambah maklumat sambungan 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,
            ],
        ],
    ],

Dalam kod di atas, kami menentukan dua alamat pelayan (127.0.0.1:3305 dan 127.0.0.1:3306 ) , ini adalah untuk melaksanakan sub-perpustakaan berbilang nod data. Nama pangkalan data, nama pengguna, kata laluan dan maklumat lain kekal tidak berubah.

  1. Buat perisian tengah pangkalan data

Buat perisian tengah pangkalan data Db.php dalam direktori apl/perisian tengah dan tambah kod berikut:

rreee

Buat di sini Perisian tengah yang dipanggil Db dicipta. Dalam kaedah pemegang, mula-mula dapatkan tatasusunan ID pelayan permintaan semasa. Kemudian bandingkan alamat pelayan ini dengan alamat sedia ada dalam kumpulan sambungan $cons Jika alamat tersebut tidak wujud, tambahkannya ke kumpulan sambungan. Akhir sekali, ikat kumpulan sambungan $conns ke contoh bekas. Dalam kaedah getServerIds, kita boleh menetapkan nama ID pelayan, yang lalai kepada uid.

  1. Daftar middleware

Tambahkan kod berikut pada config/middleware.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'];
    }
}

Kod ini digunakan untuk mendaftar middleware Db middleware kami kepada senarai aktiviti pelaksanaan perisian tengah.

  1. Melaksanakan operasi sub-perpustakaan

Seterusnya, kami akan melaksanakan operasi sub-perpustakaan mendatar dalam model. Di sini kita mengambil jadual pengguna sebagai contoh ID pengguna dibahagikan kepada 100,000 dan 100,000 sebagai had pangkalan data Ini bermakna data dengan ID pengguna antara 0 dan 100,000 disimpan dalam pangkalan data, dan seterusnya, sehingga pengguna. ID berada dalam Data antara 900,000 dan 1 juta disimpan dalam pangkalan data ke-10.

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

Di sini kami mentakrifkan 10 sambungan pangkalan data, setiap sambungan mewakili serpihan pangkalan data, mencapai tujuan sharding mendatar. Kemudian kami mentakrifkan kaedah getTableName untuk mendapatkan nama jadual data yang sepadan dengan model semasa. Kira sambungan pangkalan data yang perlu diakses berdasarkan nilai ID kunci utama dalam model dan kembalikan gabungan sambungan pangkalan data dan nama jadual data.

Ringkasan:

Artikel ini memperkenalkan operasi sub-pustaka mendatar dalam ThinkPHP6. Apabila perniagaan terus berkembang dan skala data meningkat, sharding mendatar boleh meningkatkan prestasi sistem dan kebolehskalaan, serta meningkatkan keselamatan data. Dalam ThinkPHP6, anda boleh menggunakan middleware Thinkswoole dan kaedah lain untuk melaksanakan operasi sub-perpustakaan mendatar.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan operasi sub-pangkalan data mendatar pangkalan data dalam ThinkPHP6?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn