Быстрый старт с базой данных (на основе компонентов базы данных Laravel)
webman/database разработан на основе illuminate/database и добавляет функциональность пула соединений, поддерживающего как корутины, так и некорутинные окружения. Использование аналогично laravel.
Разработчики также могут обратиться к разделу Использование других компонентов базы данных для использования ThinkPHP или других баз данных.
Внимание
Настоящее руководство относится к версии webman-v2. Если вы используете версию webman-v1, пожалуйста, обратитесь к руководству версии v1.
Установка базы данных
composer require -W webman/database illuminate/pagination illuminate/events symfony/var-dumper
После установки необходимо перезапустить (reload не сработает).
Подсказка
webman/database зависит отilluminate/database
Laravel, поэтому при установке автоматически устанавливаются зависимостиilluminate/database
.Внимание
Если вам не нужна пагинация, события базы данных или запись SQL, вам нужно выполнить только
composer require -W webman/database
.
Конфигурация базы данных
config/database.php
return [
// Дефолтная база данных
'default' => 'mysql',
// Конфигурация различных баз данных
'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, // Необходимо, когда используется swoole или swow в качестве драйвера
],
'pool' => [ // Конфигурация пула соединений
'max_connections' => 5, // Максимальное количество соединений
'min_connections' => 1, // Минимальное количество соединений
'wait_timeout' => 3, // Максимальное время ожидания для получения соединения из пула, после истечения времени будет выброшено исключение. Действительно только в корутинной среде
'idle_timeout' => 60, // Максимальное время ожидания соединений в пуле, после истечения времени они будут закрыты и освобождены, пока количество соединений не достигнет min_connections
'heartbeat_interval' => 50, // Интервал проверки активности пула соединений, в секундах, рекомендуется менее 60 секунд
],
],
],
];
Кроме конфигурации pool
, остальные настройки аналогичны Laravel.
О пуле соединений
- Каждый процесс имеет свой собственный пул соединений, соединения между процессами не共享.
- При отсутствии корутин бизнес будет последовательно выполняться в процессе, не создавая при этом параллелизма, поэтому пул соединений вмещает максимум 1 соединение.
- После включения корутин бизнес будет выполняться параллельно в процессе, пул соединений будет динамически адаптировать количество соединений по мере необходимости, при этом максимальное количество соединений не превышает
max_connections
, а минимальное – не менееmin_connections
. - Поскольку максимальное количество соединений пула составляет
max_connections
, когда количество корутин, выполняющих операции с базой данных, превышаетmax_connections
, некоторые корутины будут ждать в очереди, ожидая не болееwait_timeout
секунд, после чего произойдет исключение. - В случае простоя (включая корутинные и некорутинные окружения) соединения будут освобождаться по истечении
idle_timeout
, до тех пор, пока количество соединений не достигнетmin_connections
(min_connections
может быть равен 0).
Пример использования базы данных
<?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");
}
}
Мы видим, что использование аналогично laravel, используя метод Db::table()
для работы с базой данных.