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àoilluminate/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ủailluminate/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ơnmin_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ơnmax_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 đạtmin_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.