數(shù)據(jù)庫(kù)快速入門(基于Laravel數(shù)據(jù)庫(kù)組件)
webman/database是基于illuminate/database開(kāi)發(fā)的,并加入了連接池功能,支持協(xié)程和非協(xié)程環(huán)境,用法與laravel相同。
開(kāi)發(fā)者也可以參考使用其它數(shù)據(jù)庫(kù)組件章節(jié)使用ThinkPHP或者其它數(shù)據(jù)庫(kù)。
注意
當(dāng)前手冊(cè)為 webman-v2 版本,如果您使用的是webman-v1版本,請(qǐng)查看 v1版本手冊(cè)
數(shù)據(jù)庫(kù)安裝
composer require -W webman/database illuminate/pagination illuminate/events symfony/var-dumper
安裝后需要restart重啟(reload無(wú)效)
提示
webman/database 依賴于laravel的illuminate/database
,所以安裝時(shí)會(huì)自動(dòng)安裝illuminate/database
的依賴包。注意
如果不需要分頁(yè)、數(shù)據(jù)庫(kù)事件、記錄SQL,則只需要執(zhí)行
composer require -W webman/database
數(shù)據(jù)庫(kù)配置
config/database.php
return [
// 默認(rèn)數(shù)據(jù)庫(kù)
'default' => 'mysql',
// 各種數(shù)據(jù)庫(kù)配置
'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, // 當(dāng)使用swoole或swow作為驅(qū)動(dòng)時(shí)是必須的
],
'pool' => [ // 連接池配置
'max_connections' => 5, // 最大連接數(shù)
'min_connections' => 1, // 最小連接數(shù)
'wait_timeout' => 3, // 從連接池獲取連接等待的最大時(shí)間,超時(shí)后會(huì)拋出異常。僅在協(xié)程環(huán)境有效
'idle_timeout' => 60, // 連接池中連接最大空閑時(shí)間,超時(shí)后會(huì)關(guān)閉回收,直到連接數(shù)為min_connections
'heartbeat_interval' => 50, // 連接池心跳檢測(cè)時(shí)間,單位秒,建議小于60秒
],
],
],
];
除了pool
配置外,其它配置與laravel相同。
關(guān)于連接池
- 每個(gè)進(jìn)程有自己的連接池,進(jìn)程間不共享連接池。
- 不開(kāi)啟協(xié)程時(shí),業(yè)務(wù)在進(jìn)程內(nèi)排隊(duì)執(zhí)行,不會(huì)產(chǎn)生并發(fā),所以連接池最多只有1個(gè)連接。
- 開(kāi)啟協(xié)程后,業(yè)務(wù)在進(jìn)程內(nèi)并發(fā)執(zhí)行,連接池會(huì)根據(jù)需要?jiǎng)討B(tài)調(diào)整連接數(shù),最多不超過(guò)
max_connections
,最少不小于min_connections
。 - 因?yàn)檫B接池連接數(shù)最大為
max_connections
,當(dāng)操作數(shù)據(jù)庫(kù)的協(xié)程數(shù)大于max_connections
時(shí),會(huì)有協(xié)程排隊(duì)等待,最多等待wait_timeout
秒,超過(guò)則觸發(fā)異常。 - 在空閑的情況下(包括協(xié)程和非協(xié)程環(huán)境),連接會(huì)在
idle_timeout
時(shí)間后被回收,直到連接數(shù)為min_connections
(min_connections
可為0)。
數(shù)據(jù)庫(kù)使用示例
<?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()
方法來(lái)操作數(shù)據(jù)庫(kù)。