>PHP 프레임워크 >Laravel >Laravel에서 읽기와 쓰기를 분리하는 방법

Laravel에서 읽기와 쓰기를 분리하는 방법

WBOY
WBOY원래의
2023-05-20 19:44:35964검색

Laravel은 웹 애플리케이션을 개발하고 유지 관리하는 데 필요한 많은 강력한 기능과 도구를 제공하는 인기 있는 PHP 프레임워크입니다. 주요 기능 중 하나는 데이터베이스 읽기와 쓰기를 분리하는 것입니다. 이 기사에서는 Laravel 애플리케이션에서 읽기 및 쓰기 분리를 구현하는 방법을 소개합니다.

읽기-쓰기 분리란 무엇인가요?

기존 애플리케이션 설계에서 애플리케이션은 일반적으로 모든 데이터베이스 작업을 단일 데이터베이스 서버로 보냅니다. 이는 데이터 읽기와 쓰기가 모두 동일한 데이터베이스 서버를 통해 수행되어야 함을 의미합니다. 트래픽이 많은 애플리케이션에서는 이로 인해 데이터베이스 서버에 과도한 로드가 발생하여 성능이 저하될 수 있습니다. 따라서 한 가지 해결책은 데이터베이스 읽기 및 쓰기 분리를 도입하는 것입니다.

데이터베이스 읽기 및 쓰기 분리는 읽기 작업과 쓰기 작업을 분리하는 방법입니다. 일반적으로 애플리케이션은 마스터 데이터베이스 서버에 읽기 작업을 보내고 슬레이브 데이터베이스 서버에 쓰기 작업을 보냅니다. 이러한 방식으로 높은 동시성 조건에서 데이터베이스 서버는 더 이상 모든 읽기 및 쓰기 로드를 감당하지 않으므로 성능과 확장성이 향상됩니다.

왜 데이터베이스 읽기와 쓰기를 분리해야 하나요?

트래픽이 많은 애플리케이션에서 데이터베이스 작업은 시간이 많이 걸리는 프로세스입니다. 또한 데이터베이스 서버에 병목 현상이 발생하면 전체 애플리케이션의 성능이 저하됩니다. 데이터베이스 읽기-쓰기 분할은 읽기 작업을 마스터 데이터베이스 서버 외에 하나 이상의 슬레이브 서버로 오프로드하여 성능과 확장성을 향상시킵니다.

읽기와 쓰기를 어떻게 분리할 수 있나요?

Laravel 애플리케이션에서는 데이터베이스 구성을 변경하여 읽기-쓰기 분리를 활성화할 수 있습니다. 다음은 몇 가지 단계입니다.

  1. 데이터베이스 연결 구성

config/database.php 파일에서 데이터베이스 연결에 대한 구성 정보를 찾을 수 있습니다. 여기에서 마스터 데이터베이스 서버의 연결 매개변수를 정의할 수 있습니다.

'connections' => [
  'mysql' => [
      'driver'      => 'mysql',
      'host'        => env('DB_HOST', 'localhost'),
      'database'    => env('DB_DATABASE', 'forge'),
      'username'    => env('DB_USERNAME', 'forge'),
      'password'    => env('DB_PASSWORD', ''),
      'charset'     => 'utf8mb4',
      'collation'   => 'utf8mb4_unicode_ci',
      'prefix'      => '',
      'strict'      => false,
      'engine'      => null,
  ],
],
  1. 슬레이브 연결 추가

읽기-쓰기 분리를 활성화하려면 슬레이브 연결을 추가해야 합니다. 슬레이브 연결은 마스터 연결과 동일한 매개변수를 복사하고 연결의 호스트 이름과 자격 증명만 변경하여 생성할 수 있습니다.

'connections' => [
  'mysql' => [
      'driver'      => 'mysql',
      'host'        => env('DB_HOST', 'localhost'),
      'database'    => env('DB_DATABASE', 'forge'),
      'username'    => env('DB_USERNAME', 'forge'),
      'password'    => env('DB_PASSWORD', ''),
      'charset'     => 'utf8mb4',
      'collation'   => 'utf8mb4_unicode_ci',
      'prefix'      => '',
      'strict'      => false,
      'engine'      => null,
  ],

  'mysql_read' => [
      'driver'      => 'mysql',
      'host'        => env('DB_READ_HOST', 'localhost'),
      'database'    => env('DB_READ_DATABASE', 'forge'),
      'username'    => env('DB_READ_USERNAME', 'forge'),
      'password'    => env('DB_READ_PASSWORD', ''),
      'charset'     => 'utf8mb4',
      'collation'   => 'utf8mb4_unicode_ci',
      'prefix'      => '',
      'strict'      => false,
      'engine'      => null,
  ],
],
  1. 데이터베이스 서비스 구성

config/database.php 파일에서 데이터베이스 서비스 이름과 슬레이브 서버의 구성 정보를 정의할 수 있습니다. 여기에서는 배열을 사용하여 각각 고유한 호스트 이름과 자격 증명이 있는 여러 슬레이브 서버를 정의할 수 있습니다.

'connections' => [
  'mysql' => [
      'driver'      => 'mysql',
      'host'        => env('DB_HOST', 'localhost'),
      'database'    => env('DB_DATABASE', 'forge'),
      'username'    => env('DB_USERNAME', 'forge'),
      'password'    => env('DB_PASSWORD', ''),
      'charset'     => 'utf8mb4',
      'collation'   => 'utf8mb4_unicode_ci',
      'prefix'      => '',
      'strict'      => false,
      'engine'      => null,
  ],

  'mysql_read' => [
      'driver'      => 'mysql',
      'host'        => env('DB_READ_HOST', 'localhost'),
      'database'    => env('DB_READ_DATABASE', 'forge'),
      'username'    => env('DB_READ_USERNAME', 'forge'),
      'password'    => env('DB_READ_PASSWORD', ''),
      'charset'     => 'utf8mb4',
      'collation'   => 'utf8mb4_unicode_ci',
      'prefix'      => '',
      'strict'      => false,
      'engine'      => null,
  ],
],

'service' => [
  'mysql' => [
      'write' => 'mysql',
      'read'  => [
          'mysql_read',
      ],
  ],
],
  1. 슬레이브 선택

애플리케이션에서 다음을 사용하여 여러 슬레이브 중에서 하나를 선택할 수 있습니다.

// 获取读取的模型
$model = new Post;

// 从所有从服务器中随机选择一个
$results = $model->on('mysql_read')->inRandomOrder()->get();

또는 다음을 사용하여 슬레이브를 수동으로 선택할 수 있습니다.

// 获取读取的模型
$model = new Post;

// 手动选择第一个从服务器
$config = config('database.connections.mysql_read');
$conn = DB::connection('mysql_read');
$conn->setPdo($conn->createConnector($config)->connect());
$results = $model->setConnection($conn)->inRandomOrder()->get();

요약

구성 읽기-쓰기 분리로 애플리케이션 성능을 향상시킬 수 있습니다. 애플리케이션의 읽기 작업을 슬레이브 서버에 분산시켜 확장성을 높였습니다. Laravel 애플리케이션에서 읽기-쓰기 분리를 달성하는 방법은 간단합니다. 데이터베이스 연결 구성을 변경하고 슬레이브 연결을 추가하기만 하면 됩니다. 그런 다음 쿼리 빌더와 Eloquent ORM을 사용하여 슬레이브 서버를 선택할 수 있습니다.

위 내용은 Laravel에서 읽기와 쓰기를 분리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.