Быстрый старт с базой данных (на основе компонента Laravel)
webman/database построен на illuminate/database и добавляет пул соединений для корутин и не-корутин сред. Использование такое же, как в Laravel.
Также можно обратиться к разделу Использование других компонентов базы данных, чтобы использовать ThinkPHP или другие базы данных.
Установка базы данных
composer require -W webman/database illuminate/pagination illuminate/events symfony/var-dumper
После установки требуется перезапуск (restart), reload не сработает.
Подсказка
webman/database зависит отilluminate/databaseLaravel, поэтому при установке автоматически устанавливаются зависимости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.
О пуле соединений
- У каждого процесса свой пул соединений, между процессами пул не делится.
- Без корутин запросы выполняются последовательно, нет конкурентности, поэтому в пуле не более одного соединения.
- С корутинами запросы выполняются параллельно; пул подстраивает число соединений под нагрузку, не более
max_connectionsи не менееmin_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() для работы с базой данных.