MongoDB 연결 처리 및 지속성

참고: Unix 플랫폼에서 MongoDB 드라이버는 exec()를 호출하지 않고 fork() 시스템 호출을 사용하는 스크립트에 민감합니다. 사용자는 분기된 자식 프로세스에서 MongoDB\Driver\Manager 인스턴스를 재사용하지 않는 것이 좋습니다.


연결 및 토폴로지 지속성(1.2.0 이후의 PHP 버전)

1.2.0 이후의 모든 드라이버 버전은 PHP 작업자 프로세스에서 » libmongoc 클라이언트 개체를 유지하므로 여러 요청에서 데이터베이스 연결, 인증 상태 및 토폴로지 정보를 재사용할 수 있습니다.

MongoDB\Driver\Manager::__construct()가 호출되면 해시가 인수(즉, URI 문자열 및 배열 옵션)에서 생성됩니다. 드라이버는 해당 해시에 대해 이전에 유지된 » libmongoc< 클라이언트 개체를 찾으려고 시도합니다. 해시에 대한 기존 클라이언트를 찾을 수 없으면 새 클라이언트가 생성되고 향후 사용을 위해 유지됩니다.

각 클라이언트는 자체 데이터베이스 연결과 서버 토폴로지 보기(예: 독립 실행형, 복제본 세트, 샤드 클러스터)를 포함합니다. PHP 요청 간에 클라이언트를 유지함으로써 드라이버는 설정된 데이터베이스 연결을 재사용하고 각 요청에서 » 서버 토폴로지를 검색할 필요를 제거할 수 있습니다.

다음 예를 고려하십시오.

                  
<?php

$managers = [
    new MongoDB\Driver\Manager('mongodb://127.0.0.1'),
    new MongoDB\Driver\Manager('mongodb://127.0.0.1'),
    new MongoDB\Driver\Manager('mongodb://127.0.0.1:27017'),
    new MongoDB\Driver\Manager('mongodb://rs1.example.com,rs2.example.com/', ['replicaSet' => 'myReplicaSet']),
];

foreach ($managers as $manager) {
    $manager->executeCommand('test', new MongoDB\Driver\Command(['ping' => 1]));
}

?>
                  
                

처음 두 개의 Manager 객체는 생성자 인수가 동일하기 때문에 동일한 » libmongoc 클라이언트를 공유합니다. 세 번째 및 네 번째 개체는 각각 고유한 클라이언트를 사용합니다. 총 3개의 클라이언트가 생성되고 이 스크립트를 실행하는 PHP 작업자는 127.0.0.1에 대한 두 개의 연결과 rs1.example.comrs2.example.com 각각에 대한 하나의 연결을 엽니다. 드라이버가 hello 명령을 실행한 후 복제본 세트의 추가 구성원을 발견하면 해당 서버에 대한 추가 연결도 열립니다.

동일한 작업자가 두 번째 요청에서 스크립트를 다시 실행하면 세 클라이언트가 다시 사용되며 새 연결이 만들어지지 않아야 합니다. 이전 요청이 제공된 기간에 따라 드라이버는 토폴로지 보기를 업데이트하기 위해 추가 hello 명령을 실행해야 할 수 있습니다.


소켓 지속성(1.2.0 이전의 PHP 버전)

1.2.0 이전 버전의 PHP 드라이버는 » libmongoc 내의 API를 사용하여 소켓 통신을 위한 맞춤 핸들러를 지정하여 데이터베이스 연결에 PHP의 Streams API를 활용합니다. 그러나 각 MongoDB\Driver\Manager에 대해 새 libmongoc 클라이언트가 생성됩니다. 결과적으로 드라이버는 개별 데이터베이스 연결을 유지하지만 인증 상태 또는 토폴로지 정보는 유지하지 않습니다. 즉, 드라이버는 인증 및 » 서버 토폴로지 검색을 위해 각 요청이 시작될 때 명령을 실행해야 합니다.

데이터베이스 연결은 서버의 호스트, 포트 및 MongoDB\Driver\Manager를 구성하는 데 사용되는 URI 문자열에서 파생된 해시에 의해 유지됩니다. 생성자의 배열 옵션은 이 해시에 포함되지 않습니다.

참고: 드라이버 버전 >= 1.1.8 및 < 1.2.0은 SSL 연결용 소켓을 유지하지 않습니다. 추가 정보는 » PHPC-720을 참조하세요.

SSL 연결 시기 및 토폴로지 정보를 유지하는 단점에도 불구하고 이 버전의 드라이버는 PHP의 Streams API를 사용하기 때문에 모든 SSL 컨텍스트 옵션을 지원합니다.