[이 블로그는 http://nitschinger.at/ 에서 신디케이트되었습니다.]

이 블로그 게시물에서는 엔티티 앞의 간단하고 빠르며 탄력적인 캐시로 Couchbase Server 2.0을 사용하여 Doctrine ORM 계층의 속도를 높일 수 있는 방법을 소개합니다.

동기 부여
Couchbase를 프레임워크 및 라이브러리와 더욱 통합하기 위한 지속적인 노력의 일환으로, 다음과 같은 캐싱 지원을 추가했습니다. 교리 ORM. 최근 풀 리퀘스트가 마스터 브랜치에 병합되었으며 2.4 릴리즈와 함께 게시될 예정입니다.
캐싱은 독립적으로 사용하거나(다음에서 제공하는 API를 통해) 교리/공통) 또는 ORM 기능과 통합되어 있습니다. 간단한 예제를 통해 두 가지 변형을 살펴볼 것이며, 좋은 문서도 찾을 수 있습니다. 여기. 이 문서를 작성할 당시에는 아직 문서를 업데이트해야 하므로 CouchbaseCache가 캐싱 드라이버로 언급되지 않았습니다.
2.4가 아직 출시되지 않았으므로, 우리는 2.4.x-dev 브랜치입니다. 우리는 작곡가 를 사용하여 종속성을 가져올 수 있으므로 나중에 2.4로 고정하려면 버전 번호를 변경하면 됩니다.
간단한 캐싱
첫 번째 예시는 캐싱 API를 직접 사용하는 방법을 보여줍니다. Couchbase API에 익숙하다면 의미론은 같을 수도 있고 다를 수도 있는 다른 API라고 생각할 수도 있지만, 핵심은 Doctrine Cache API 인터페이스를 사용하므로 다른 캐싱 구현 간에 매우 쉽게 전환할 수 있다는 점입니다.
라는 디렉터리를 만듭니다. 카우치베이스-독트린-심플 를 사용하여 composer.json 내부:
{
"require": {
"교리/공통": "2.4.x-dev",
"ext-couchbase": "1.1.x"
}
}
이렇게 하면 교리/공통 패키지가 있는지 확인하고 couchbase.so 확장 프로그램을 설치하세요. 아직 Couchbase PHP 확장 프로그램을 설치하지 않았다면 다음 페이지로 이동하여 공식 웹사이트 를 클릭하고 튜토리얼과 문서에 따라 설치하세요.
만들기 index.php 에 다음 내용을 추가합니다(나중에 코드를 세분화하겠습니다):
// 0: 작곡가 자동 로더
require 'vendor/autoload.php';

// 1: 카우치베이스 연결 열기
$couchbase = new 카우치베이스(“127.0.0.1”, “”, “”, "default");

// 2: 드라이버 인스턴스화 및 연결 주입
$cacheDriver = new 도그트리커먼 캐시 카우치베이스 캐시();
$cacheDriver->setCouchbase($couchbase);

// 3: 명령을 실행하세요!
$key = "내 캐시 항목";

만약(!$cacheDriver->포함($key)) {
$cacheDriver->저장($key, "my_data");
} else {
echo $cacheDriver->fetch($key);
}

?>

먼저 컴포저 자동 로더를 부트스트랩해야 모든 컴포저를 require 문을 직접 작성할 수 있습니다. 다음으로 해야 할 일은 실제로 Couchbase 클러스터에 연결하는 것입니다:
// 1: 카우치베이스 연결 열기
$couchbase = new 카우치베이스(“127.0.0.1”, “”, “”, "default");
여기서는 클러스터에서 다음을 가리키는 노드에 연결하고 있습니다. localhost를 사용하지만 노드 배열을 전달할 수도 있습니다. 우리는 기본값 버킷을 생성합니다. 이제 연결이 설정되었으므로 캐시 드라이버를 인스턴스화하고 Couchbase 클라이언트를 삽입할 수 있습니다:
// 2: 드라이버 인스턴스화 및 연결 주입
$cacheDriver = new 도그트리커먼 캐시 카우치베이스 캐시();
$cacheDriver->setCouchbase($couchbase);
여기서부터는 모든 캐시 드라이버에 대해 API가 동일합니다. 다음 코드는 캐시에 키가 포함되어 있는지 확인합니다. 키가 있으면 문서를 인쇄하지만 키가 없으면 새 문서를 만듭니다. 이것은 매우 간단한 예시이지만 몇 줄의 부트스트랩만으로 자신의 프로젝트에서 Couchbase 캐싱을 사용할 수 있는 방법을 보여줍니다!
이 세 가지 방법 외에도 다음과 같은 방법도 있습니다. 삭제 메서드를 사용할 수 있습니다. 마지막으로 세 번째 매개변수(선택 사항)를 전달할 수 있습니다. 저장 와 $라이프타임 로 설정하여 캐시 항목이 자동으로 사라지도록 합니다.
카우치베이스 서버는 무엇을 저장하든 상관하지 않으므로 리소스 외에 모든 종류의 데이터 유형을 저장하고 가져올 수 있습니다:
$cacheDriver->저장($key, 배열('foo' => 'bar'));
var_dump($cacheDriver->fetch($key));
이 수준에서 드라이버를 사용할 때는 가능하면 JSON 문자열을 저장하세요( JSON_ENCODE/JSON_DECODE 데이터 구조에) 이렇게 하면 Couchbase Server 2.0의 새로운 보기 엔진을 활용할 수 있습니다. 직렬화된 객체도 언제든지 저장할 수 있습니다(ORM 통합에서 해야 하는 것처럼). Couchbase Server에서는 바이트 스트림에 불과하기 때문입니다.
이제 이 기반을 바탕으로 ORM 통합이 어떻게 작동하는지 살펴볼 수 있습니다.
ORM 통합
라는 새 디렉터리를 만듭니다. 카우치베이스-독트린-오름 를 사용하여 composer.json:
{
"require": {
"교리/오름": "2.4.x-dev",
"doctrine/dbal": "2.4.x-dev",
"교리/공통": "2.4.x-dev",
"ext-couchbase": "1.1.x"
},
"자동 로드": {
"psr-0": {
"엔티티": "src/"
}
}
}
이번에는 composer.json 파일은 모든 종속성을 직접 정의해야 하기 때문에 조금 더 길어집니다(안정적인 릴리스에 대해 작업하고 싶지 않기 때문입니다). Doctrine 엔티티를 정의해야 하므로 컴포저 자동 로더에 사용자 정의 디렉토리(src/).
다음으로 필요한 것은 Doctrine을 통해 관리할 실제 엔티티입니다. 계속해서 Person.php 파일 안에 src/엔티티 디렉토리에 다음 내용을 추가합니다:
네임스페이스 엔티티;

/** @Entity */
클래스 사람 {

/**
* @Id @Column(type="integer") @GeneratedValue(strategy="AUTO")
*/

비공개 $id;

/** @Column(type="string") */
비공개 $이름;

/** @Column(type="string") */
비공개 1TP4성명;

public 함수 setFirstname($이름) {
$이것->이름 = $이름;
}

public 함수 getFirstname() {
반환 $이것->이름;
}

public 함수 setLastname(1TP4성명) {
$이것-> = 1TP4성명;
}

public 함수 getLastname() {
반환 $이것->;
}

}
?>

이것은 몇 가지 속성을 가진 매우 간단한 도리 엔티티이며 자동 생성된 ID 필드에 추가합니다. 저는 SQLite 을 사용했지만, MySQL 또는 사용 가능한 다른 관계형 데이터베이스를 자유롭게 사용할 수 있습니다.
모든 것을 함께 연결하기 위해 다음과 같이 index.php 파일을 프로젝트의 루트 디렉토리에 추가합니다. 다시 말씀드리지만, 전체 내용은 여기에 있으며 나중에 자세히 설명하겠습니다:
// 작곡가 자동 로더.
$loader = require 'vendor/autoload.php';

/**
* 카우치베이스 및 캐시를 초기화합니다.
*/

$couchbase = new 카우치베이스(“127.0.0.1”, “”, “”, "default");
$cacheDriver = new 도그트리커먼 캐시 카우치베이스 캐시();
$cacheDriver->setCouchbase($couchbase);

/**
* 엔티티 관리자를 초기화합니다.
*/

$경로 = 배열(__DIR__ . '/src/Entities/');
$isDevMode = true;
$dbParams = 배열(
'driver' => 'pdo_sqlite',
'user' => 'root',
'password' => ,
'경로' => __DIR__ . '/cbexample.sqlite'
);

$config = 교리ORM도구설정::주석 메타데이터 구성 만들기($경로, $isDevMode, null, $cacheDriver);
$em = Doctrine 또는 엔티티 관리자::create($dbParams, $config);

/**
* 엔티티와 협력하세요.
*/

1TP4인 = new 엔티티 개인();
1TP4인->setFirstname("Michael");
1TP4인->setLastname("Nitschinger");

$em->지속(1TP4인);
$em->플러시();

// 결과 캐시를 사용한 쿼리
$쿼리 = $em->createQuery('EntitiesPerson p에서 p 선택');
$쿼리->사용결과 캐시(true);
1TP4결과 = $쿼리->getResult();

?>

이해하기 어려울 수 있으므로 더 작은 크기로 나눠서 설명하겠습니다.
$couchbase = new 카우치베이스(“127.0.0.1”, “”, “”, "default");
$cacheDriver = new 도그트리커먼 캐시 카우치베이스 캐시();
$cacheDriver->setCouchbase($couchbase);
오토로더를 부트스트랩한 후 캐시 드라이버를 초기화합니다. 앞서 간단한 예제에서 동일한 코드를 사용했기 때문에 이것이 무엇을 의미하는지 이미 알고 계실 것입니다.
$경로 = 배열(__DIR__ . '/src/Entities/');
$isDevMode = true;
$dbParams = 배열(
'driver' => 'pdo_sqlite',
'user' => 'root',
'password' => ,
'경로' => __DIR__ . '/cbexample.sqlite'
);

$config = 교리ORM도구설정::주석 메타데이터 구성 만들기($경로, $isDevMode, null, $cacheDriver);
$em = Doctrine 또는 엔티티 관리자::create($dbParams, $config);

그리고 Doctrine 또는 엔티티 관리자 은 Doctrine 내부의 주요 구성 요소 중 하나이므로 그에 따라 초기화해야 합니다. 따라서 유효한 구성을 제공해야 합니다. 여기서는 어노테이션을 사용하겠습니다(Doctrine 엔티티에서 볼 수 있지만 XML 또는 YAML을 통해서도 할 수 있습니다). 또한 데이터베이스 연결과 엔티티에 대한 경로를 제공해야 합니다. 여기서 중요한 부분은 $cacheDriver 를 공장 메서드로 설정합니다. 이렇게 하면 자동으로 카우치베이스 캐시 를 사용하여 모든 종류의 캐싱(쿼리, 메타데이터 및 결과 캐싱)에 사용할 수 있습니다.
이제 레코드를 만들 수 있습니다:
1TP4인 = new 엔티티 개인();
1TP4인->setFirstname("Michael");
1TP4인->setLastname("Nitschinger");

$em->지속(1TP4인);
$em->플러시();

나중에 쿼리를 통해 다시 가져올 수 있습니다:
$쿼리 = $em->createQuery('EntitiesPerson p에서 p 선택');
$쿼리->사용결과 캐시(true);
1TP4결과 = $쿼리->getResult();
이 쿼리 결과를 캐시하도록 명시적으로 지정했습니다(기본적으로 결과 캐싱은 사용되지 않음). 브라우저를 열고 Couchbase Server 2.0 관리 UI를 가리키면 Doctrine이 백그라운드에서 많은 문서를 생성한 것을 볼 수 있습니다. 이러한 문서는 이후 애플리케이션 성능을 향상시키는 데 사용됩니다.
요약
보시다시피 Couchbase를 Doctrine용 캐시로 사용하는 것은 어렵지 않습니다. 초기화하고 구성에 전달하기만 하면 됩니다. 이 시점부터는 모든 것이 백그라운드에서 이루어집니다. 그리고 뛰어난 성능뿐만 아니라 지속성, 확장성 및 Couchbase Server가 기본적으로 제공하는 모든 멋진 기능도 얻을 수 있다는 사실을 잊지 마세요.
질문이나 의견이 있으시면 댓글로 알려주세요! 마지막으로, 다음 분들께 감사드립니다. 마르코 피베타 ORM 통합 관련 문제를 디버깅하는 데 도움을 주셔서 감사합니다!

작성자

게시자 카우치베이스 팀

의 선임 웹 관리자입니다. 웹 사이트 관리자로서 디자인, 구현, 콘텐츠 및 성능을 포함한 웹 사이트 자산에 대한 전반적인 책임을 맡고 있습니다.

댓글 남기기