คู่มือเริ่มต้นอย่างรวดเร็วเกี่ยวกับฐานข้อมูล (บนพื้นฐานของคอมโพเนนต์ฐานข้อมูล Laravel)

webman/database ถูกพัฒนาขึ้นจาก illuminate/database และได้เพิ่มฟังก์ชันการเชื่อมต่อแบบพูล รองรับทั้งสภาพแวดล้อมแบบ coroutine และ non-coroutine โดยมีวิธีใช้งานเหมือน Laravel

นักพัฒนาสามารถดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ คอมโพเนนต์ฐานข้อมูลอื่น ๆ เช่น ThinkPHP หรือฐานข้อมูลอื่น ๆ

หมายเหตุ
เอกสารนี้เป็นเวอร์ชัน webman-v2 หากคุณใช้เวอร์ชัน webman-v1 โปรดดูที่ เอกสารเวอร์ชัน v1

การติดตั้งฐานข้อมูล

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

หลังจากติดตั้งแล้วต้องทำการ restart (reload จะไม่มีผล)

提示
webman/database มีการพึ่งพา illuminate/database ของ Laravel ดังนั้นเมื่อทำการติดตั้งจะมีการติดตั้งแพ็คเกจที่พึ่งพาอัตโนมัติ

หมายเหตุ
หากไม่ต้องการการแบ่งหน้า, เหตุการณ์ฐานข้อมูล, หรือการบันทึก 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,    // เวลารอสูงสุดในการรับการเชื่อมต่อจากพูล หากหมดเวลาจะเกิดข้อยกเว้น จะมีผลเฉพาะในสภาพแวดล้อม coroutine
                'idle_timeout' => 60,   // เวลารอสูงสุดสำหรับการเชื่อมต่อที่ไม่ได้ใช้งานในพูล เมื่อหมดเวลาจะมีการปิดการเชื่อมต่อจนกว่าจำนวนการเชื่อมต่อจะมีค่าเป็น min_connections
                'heartbeat_interval' => 50, // เวลาตรวจสอบการเต้นของหัวใจของพูลการเชื่อมต่อ หน่วยเป็นวินาที แนะนำให้น้อยกว่า 60 วินาที
            ],
        ],
    ],
];

การกำหนดค่าอื่น ๆ ที่ไม่ใช่ pool จะเหมือนกับ Laravel

เกี่ยวกับการเชื่อมต่อแบบพูล

  • ทุกโปรเซสมีพูลการเชื่อมต่อของตนเอง ซึ่งไม่แชร์พูลการเชื่อมต่อระหว่างโปรเซส
  • เมื่อไม่เปิดใช้งาน coroutine ธุรกิจจะถูกคิวภายในโปรเซส จะไม่มีการทำงานแบบคู่ขนาน ดังนั้นพูลการเชื่อมต่อจะมีได้เพียง 1 การเชื่อมต่อเท่านั้น
  • เมื่อเปิดใช้งาน coroutine ธุรกิจจะทำงานแบบคู่ขนานภายในโปรเซส พูลการเชื่อมต่อจะปรับจำนวนการเชื่อมต่อได้ตามความต้องการ สูงสุดไม่เกิน max_connections และต่ำสุดไม่ต่ำกว่า min_connections
  • เนื่องจากจำนวนการเชื่อมต่อสูงสุดในพูลคือ max_connections หากมีจำนวน coroutine ที่ดำเนินการฐานข้อมูลมากกว่า max_connections จะมี coroutine รอคิวถึงจำนวนสูงสุด wait_timeout วินาที หากเกินจะเกิดข้อยกเว้น
  • ในกรณีที่ไม่มีการใช้งาน (รวมถึงสภาพแวดล้อม coroutine และ non-coroutine) การเชื่อมต่อจะถูกเก็บคืนหลังจากเวลาที่กำหนดใน 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() ในการจัดการฐานข้อมูล