Hướng dẫn nhanh về cơ sở dữ liệu (dựa trên thành phần cơ sở dữ liệu Laravel)

webman/database được phát triển dựa trên illuminate/database và đã thêm tính năng kết nối hồ bơi, hỗ trợ cả môi trường coroutine và không coroutine, cách sử dụng giống với laravel.

Các nhà phát triển cũng có thể tham khảo chương Sử dụng các thành phần cơ sở dữ liệu khác để sử dụng ThinkPHP hoặc các cơ sở dữ liệu khác.

Lưu ý
Tài liệu hiện tại là phiên bản webman-v2, nếu bạn đang sử dụng phiên bản webman-v1, vui lòng xem tài liệu phiên bản v1

Cài đặt cơ sở dữ liệu

composer require -W webman/database illuminate/pagination illuminate/events symfony/var-dumper

Sau khi cài đặt, cần phải restart (reload không có hiệu lực)

Mẹo
webman/database phụ thuộc vào illuminate/database của laravel, vì vậy khi cài đặt sẽ tự động cài đặt các gói phụ thuộc của illuminate/database.

Lưu ý
Nếu không cần phân trang, sự kiện cơ sở dữ liệu, ghi lại SQL, chỉ cần thực hiện
composer require -W webman/database

Cấu hình cơ sở dữ liệu

config/database.php


return [
    // Cơ sở dữ liệu mặc định
    'default' => 'mysql',

    // Các cấu hình cơ sở dữ liệu khác nhau
    'connections' => [
        'mysql' => [
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'test',
            'username'    => 'root',
            'password'    => '',
            'unix_socket' => '',
            'charset'     => 'utf8',
            'collation'   => 'utf8_unicode_ci',
            'prefix'      => '',
            'strict'      => true,
            'engine'      => null,
            'options' => [
                PDO::ATTR_EMULATE_PREPARES => false, // Cần thiết khi sử dụng swoole hoặc swow làm driver
            ],
            'pool' => [ // Cấu hình hồ bơi kết nối
                'max_connections' => 5, // Số kết nối tối đa
                'min_connections' => 1, // Số kết nối tối thiểu
                'wait_timeout' => 3,    // Thời gian chờ tối đa để lấy kết nối từ hồ bơi, hết thời gian sẽ phát sinh exception. Chỉ hiệu lực trong môi trường coroutine
                'idle_timeout' => 60,   // Thời gian kết nối tối đa không sử dụng trong hồ bơi, hết thời gian sẽ đóng và thu hồi, cho đến khi số lượng kết nối đạt min_connections
                'heartbeat_interval' => 50, // Thời gian kiểm tra nhịp tim của hồ bơi, đơn vị giây, đề xuất nhỏ hơn 60 giây
            ],
        ],
    ],
];

Ngoài cấu hình pool, các cấu hình khác giống với laravel.

Về hồ bơi kết nối

  • Mỗi tiến trình có hồ bơi kết nối riêng, các tiến trình không chia sẻ hồ bơi kết nối.
  • Khi không mở coroutine, các tác vụ trong tiến trình sẽ thực hiện theo hàng đợi, không phát sinh đồng thời, vì vậy hồ bơi kết nối chỉ có tối đa 1 kết nối.
  • Khi mở coroutine, các tác vụ trong tiến trình sẽ thực hiện đồng thời, hồ bơi kết nối sẽ tự động điều chỉnh số lượng kết nối theo nhu cầu, tối đa không quá max_connections, tối thiểu không nhỏ hơn min_connections.
  • Bởi vì số lượng kết nối tối đa trong hồ bơi là max_connections, khi số lượng coroutine thao tác cơ sở dữ liệu lớn hơn max_connections, sẽ có một số coroutine xếp hàng chờ đợi, tối đa chờ wait_timeout giây, quá thời gian sẽ phát sinh exception.
  • Trong trường hợp không sử dụng (bao gồm cả môi trường coroutine và không coroutine), kết nối sẽ bị thu hồi sau thời gian idle_timeout, cho đến khi số lượng kết nối đạt min_connections (min_connections có thể là 0).

Ví dụ sử dụng cơ sở dữ liệu

<?php
namespace app\controller;

use support\Request;
use support\Db;

class UserController
{
    public function db(Request $request)
    {
        $default_uid = 29;
        $uid = $request->get('uid', $default_uid);
        $name = Db::table('users')->where('uid', $uid)->value('username');
        return response("hello $name");
    }
}

Chúng ta thấy, cách sử dụng giống với laravel, sử dụng phương thức Db::table() để thao tác với cơ sở dữ liệu.