คู่มือเริ่มต้นอย่างรวดเร็วเกี่ยวกับฐานข้อมูล (บนพื้นฐานของคอมโพเนนต์ฐานข้อมูล 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()
ในการจัดการฐานข้อมูล