データベースクイックスタート(Laravelデータベースコンポーネントに基づく)

webman/databaseは、illuminate/databaseを基に開発されており、接続プール機能を追加し、コルーチン環境と非コルーチン環境をサポートします。使い方はlaravelと同様です。

開発者は、他のデータベースコンポーネントの使用セクションを参考にして、ThinkPHPや他のデータベースを使用することもできます。

注意
現在のマニュアルは webman-v2 バージョン用です。webman-v1 バージョンを使用している場合は、v1バージョンマニュアルを参照してください。

データベースのインストール

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

インストール後はrestart再起動する必要があります(reloadは無効です)。

ヒント
webman/databaseはlaravelのilluminate/databaseに依存しているため、インストール時に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()メソッドを使用してデータベースを操作します。