Быстрый старт с базой данных (на основе компонентов базы данных 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() для работы с базой данных.