>  기사  >  PHP 프레임워크  >  모든 Swoole 코루틴은 어떻게 동일한 데이터베이스 연결을 공유합니까?

모든 Swoole 코루틴은 어떻게 동일한 데이터베이스 연결을 공유합니까?

WBOY
WBOY원래의
2023-06-25 11:00:411193검색

인터넷의 급속한 발전과 데이터 양의 지속적인 증가로 인해 애플리케이션의 고성능과 확장성을 보장하기 위해 개발자는 비동기 프로그래밍 프레임워크를 널리 사용하기 시작했습니다. Swoole은 출시 이후 PHP 비동기 프로그래밍의 선구자가 되었으며 점점 더 많은 개발자의 선호를 받고 있습니다. Swoole은 애플리케이션의 동시 요청 처리 기능을 크게 향상시킬 수 있는 완전한 코루틴 지원을 제공합니다. 일부 애플리케이션 시나리오에서는 서로 다른 코루틴이 동일한 데이터베이스 연결을 공유해야 합니다. 이 경우 Swoole 코루틴 공유 기술을 사용해야 합니다.

Swoole 코루틴 공유 기술의 핵심은 연결 풀에 있는 데이터베이스 연결을 코루틴에 할당하여 사용하는 것입니다. 이것의 장점은 각 코루틴이 데이터베이스에 연결하지 않아도 되므로 연결 오버헤드가 줄어들고 애플리케이션 성능이 향상된다는 것입니다. 다중 코루틴 환경에서는 동일한 연결 풀에서 데이터베이스 연결을 공유하면 연결 수에 따른 제한을 피할 수도 있습니다.

Swoole이 동일한 데이터베이스 연결을 공유하기 위해 코루틴을 구현하는 방법을 살펴보겠습니다.

1단계: Swoole 확장 설치

Swoole 공식 웹사이트에서는 설치 튜토리얼을 제공합니다. 몇 가지 간단한 단계만 거치면 설치가 완료됩니다. 설치가 완료되면 php.ini 파일에 swoole 확장 구성을 추가해야 합니다.

extension=swoole.so

2단계: 연결 풀 만들기

Swoole에서 연결 풀은 매우 중요한 개념이며 그 기능은 다음과 같습니다. 데이터베이스 연결 재사용성을 높입니다. 연결 풀은 데이터베이스에 대한 빈번한 연결을 방지하고 애플리케이션의 효율성을 보장하기 위해 연결의 지속성을 유지합니다. Swoole의 연결 풀 클래스 SwooleCoroutineMySQLPool을 사용하여 연결 풀 개체를 생성할 수 있습니다. SwooleCoroutineMySQLPool 来创建一个连接池对象。

<?php
$dbconfig = [
    'host' => '127.0.0.1',
    'port' => 3306,
    'user' => 'root',
    'password' => '',
    'database' => 'test_db',
    'charset' => 'utf8mb4',
    'timeout' => 30,
    'strict_type' => true,
    'fetch_mode' => true,
    'max_idle_time' => 3,
    'max_object_num' => 20,
];

$pool = new SwooleCoroutineMySQLPool($dbconfig);

连接池配置项说明:

  • host:数据库连接的主机地址
  • port:数据库连接的端口号
  • user:数据库连接的用户名
  • password:数据库连接的密码
  • database:默认使用的数据库名称
  • charset:连接使用的编码
  • timeout:连接超时时间
  • strict_type:是否开启严格模式
  • fetch_mode:是否使用自定义数据获取方式
  • max_idle_time:连接最大空闲时间
  • max_object_num:连接池中最多存在的连接数

第三步:获取连接对象

创建连接池后,需要在每个协程中获取数据库连接对象。在Swoole中,可以通过 SwooleCoroutineMySQLPool->get() 方法获取数据库连接对象。

<?php
go(function () use ($pool) {
    // 获取连接对象
    $conn = $pool->get();
    // 查询操作
    $result = $conn->query('SELECT * FROM users');
    // 归还连接
    $pool->put($conn);
});

注意:每个协程都要通过连接池获取连接对象,避免多个协程同时操作同一个连接对象。

第四步:关闭连接

协程使用完连接对象后,应该将其归还给连接池。在Swoole中,可以通过 SwooleCoroutineMySQLPool->put() 将连接归还给连接池。

<?php
go(function () use ($pool) {
    $conn = $pool->get();
    $result = $conn->query('SELECT * FROM users');
    $pool->put($conn);
});

第五步:实现协程共享同一连接池

在实际的应用场景中,通常需要实现协程共享同一连接池的需求。这时候,我们可以通过依赖注入的方式来实现。

<?php
// 创建连接池
$dbconfig = [
    'host' => '127.0.0.1',
    'port' => 3306,
    'user' => 'root',
    'password' => '',
    'database' => 'test_db',
    'charset' => 'utf8mb4',
    'timeout' => 30,
    'strict_type' => true,
    'fetch_mode' => true,
    'max_idle_time' => 3,
    'max_object_num' => 20,
];

$pool = new SwooleCoroutineMySQLPool($dbconfig);

// 注册依赖库
$container = new Container();
$container->singleton(Pool::class, function () use ($pool) {
    return $pool;
});

在代码中注册了连接池实例到容器中,并使用 singleton() 方法将其设为单例对象,确保多个协程共享同一连接池的实例。

下面演示如何在协程中使用连接池:

<?php

// 协程1
go(function () use ($container) {
    $pool = $container->make(Pool::class);
    $conn = $pool->get();
    $result = $conn->query('SELECT * FROM users');
    $pool->put($conn);
});

// 协程2
go(function () use ($container) {
    $pool = $container->make(Pool::class);
    $conn = $pool->get();
    $result = $conn->query('SELECT * FROM users');
    $pool->put($conn);
});

通过 make()rrreee

연결 풀 구성 항목 설명:

  • host: 데이터베이스 연결의 호스트 주소
  • port: 데이터베이스 연결의 포트 번호
  • user : 데이터베이스 연결 이름의 사용자
  • password: 데이터베이스 연결을 위한 비밀번호
  • database: 기본 데이터베이스 이름
  • charset: 연결에 사용되는 인코딩
  • timeout: 연결 시간 초과
  • strict_type: 엄격 모드 활성화 여부
  • fetch_mode: 사용자 정의 데이터 수집 방법 사용 여부
  • max_idle_time: 최대 유휴 시간 연결
  • max_object_num: 연결 풀의 최대 연결 수
3단계: 연결 개체 얻기

연결 풀을 생성한 후 데이터베이스를 가져와야 합니다. 각 코루틴의 연결 개체입니다. Swoole에서는 SwooleCoroutineMySQLPool->get() 메서드를 통해 데이터베이스 연결 개체를 얻을 수 있습니다. 🎜rrreee🎜참고: 여러 코루틴이 동시에 동일한 연결 개체를 작동하는 것을 방지하려면 각 코루틴이 연결 풀을 통해 연결 개체를 얻어야 합니다. 🎜🎜4단계: 연결 닫기🎜🎜코루틴이 연결 개체를 사용한 후에는 연결 개체를 연결 풀로 반환해야 합니다. Swoole에서는 SwooleCoroutineMySQLPool->put()을 통해 연결을 연결 풀로 반환할 수 있습니다. 🎜rrreee🎜5단계: 동일한 연결 풀을 공유하는 코루틴 구현🎜🎜실제 애플리케이션 시나리오에서는 일반적으로 동일한 연결 풀을 공유하기 위해 코루틴에 대한 요구 사항을 구현해야 합니다. 이때 의존성 주입을 통해 이를 달성할 수 있습니다. 🎜rrreee🎜코드의 컨테이너에 연결 풀 인스턴스를 등록하고 singleton() 메서드를 사용하여 싱글톤 개체로 설정하여 여러 코루틴이 동일한 연결 풀 인스턴스를 공유하도록 했습니다. 🎜🎜다음은 코루틴에서 연결 풀을 사용하는 방법을 보여줍니다. 🎜rrreee🎜make() 메서드를 통해 코루틴에서 종속 라이브러리 인스턴스를 얻을 수 있으므로 여러 코루틴이 연결 풀을 공유할 수 있습니다. 동일한 데이터베이스 연결. 🎜🎜요약🎜🎜Swoole의 코루틴 공유 기술은 빈번한 데이터베이스 연결을 방지하고 애플리케이션 성능과 확장성을 향상시킬 수 있습니다. 코루틴이 동일한 연결 풀을 공유한다는 것을 인식하면 종속성 주입을 통해 이를 달성할 수 있으므로 동일한 데이터베이스 연결을 공유하는 여러 코루틴의 목적을 달성할 수 있습니다. 다음 번에 애플리케이션을 개발할 때 Swoole의 코루틴 기술을 사용해야 한다면 애플리케이션의 효율성을 향상시키기 위해 코루틴 공유 기술을 사용해 보는 것이 좋습니다. 🎜

위 내용은 모든 Swoole 코루틴은 어떻게 동일한 데이터베이스 연결을 공유합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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