데이터베이스 빠른 시작(기반 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()
메서드를 사용하여 데이터베이스에 접근합니다.