개요
이 가이드에서는 연결 string 과 MongoDB\Client
객체를 사용하여 다양한 유형의 MongoDB deployment에 연결하는 방법을 배울 수 있습니다.
Atlas
MongoDB 에서 deployment에 Atlas 연결하려면 연결 에 다음 요소를 string 포함하세요.
Atlas cluster 의 URI
데이터베이스 사용자 이름
데이터베이스 사용자의 비밀번호
그런 다음 연결 string 을 MongoDB\Client
생성자에 전달합니다.
Atlas 에 연결할 때 Stable API 클라이언트 옵션을 사용하여 Atlas 를 새 버전의 MongoDB Server 로 업그레이드할 때 호환성이 손상되는 변경을 방지하는 것이 좋습니다. Stable API 기능 에 학습 보려면 Stable API 페이지를 참조하세요.
다음 코드는 PHP 라이브러리를 사용하여 Atlas cluster 에 연결하는 방법을 보여줍니다. 또한 이 코드는 serverApi
옵션을 사용하여 Stable API 버전을 지정합니다.
// Replace the placeholder with your Atlas connection string $uri = '<connection string>'; // Create a MongoDB client with server API options $client = new MongoDB\Client($uri, [], [ 'serverApi' => new MongoDB\Driver\ServerApi('1'), ]); // Ping the server to verify that the connection works $admin = $client->admin; $command = new MongoDB\Driver\Command(['ping' => 1]); $result = $admin->command($command)->toArray(); echo json_encode($result), PHP_EOL; echo 'Pinged your deployment. You successfully connected to MongoDB!\n';
팁
빠른 시작의 연결 string만들기 단계에 따라 연결 string 을 조회 합니다.
로컬 배포
로컬 MongoDB deployment에 연결하려면 localhost
을 호스트 이름으로 사용합니다. 기본적으로 mongod
프로세스는 포트 27017 에서 실행되지만, 배포서버에 맞게 사용자 지정할 수 있습니다.
다음 코드는 PHP 라이브러리를 사용하여 로컬 MongoDB deployment 에 연결하는 방법을 보여줍니다.
$uri = 'mongodb://localhost:27017'; $uriOptions = ['serverSelectionTimeoutMS' => 10000]; $client = new MongoDB\Client($uri, $uriOptions);
복제본 세트
복제본 세트 에 연결하려면 연결 에 IP 복제본 세트 멤버의 호스트 이름(또는 주소)과 포트 번호를 string 지정합니다.
복제본 세트 에 있는 호스트의 전체 목록을 제공할 수 없는 경우, 복제본 복제본 세트 에 있는 호스트 중 하나 이상을 지정하고 다른 호스트를 찾기 위해 자동 검색을 수행하도록 PHP 라이브러리에 지시할 수 있습니다. 운전자 에 자동 검색을 수행하도록 지시하려면 다음 작업 중 하나를 선택합니다.
복제본 세트의 이름을
replicaSet
매개변수의 값으로 지정합니다.directConnection
매개 변수의 값으로false
를 지정합니다.복제본 세트에 둘 이상의 호스트를 지정합니다.
다음 예시에서 드라이버는 샘플 연결 URI를 사용하여 host1
를 포함하여 서로 다른 세 호스트의 27017
포트에서 실행 중인 MongoDB 복제본 세트 sampleRS
에 연결합니다.
$uri = 'mongodb://host1:27017/?replicaSet=sampleRS'; // Create a MongoDB client $client = new MongoDB\Client($uri);
초기화
복제본 세트 를 초기화하려면 단일 멤버에 직접 연결해야 합니다. 이렇게 하려면 연결 string 에서 directConnection
연결 옵션을 true
로 설정하다 합니다. 다음 코드 예시 에서는 이 연결 옵션을 설정하다 하는 방법을 보여줍니다.
// Replace the placeholders with your actual hostname and port $uri = 'mongodb://<hostname>:<port>/?directConnection=true'; // Create a MongoDB client $client = new MongoDB\Client($uri);
참고
Docker에서의 복제본 세트
복제본 세트 Docker 에서 실행되면 MongoDB 엔드포인트를 하나만 노출할 수 있습니다. 이 경우 복제본 세트 검색할 수 없습니다. 연결 URI에 directConnection=false
을(를) 지정하거나 이 옵션을 설정하지 않은 상태로 두면 애플리케이션 연결 URI에 연결되지 않을 수 있습니다.
테스트 또는 개발 환경에서 directConnection=true
를 지정하여 복제본 세트에 연결할 수 있습니다. 프로덕션 환경에서는 Docker 가상 네트워크 외부에서 각 MongoDB 인스턴스에 액세스할 수 있도록 클러스터를 구성하는 것이 좋습니다.
DNS 서비스 검색
DNS 서비스 검색을 사용하여 연결하려는 서비스의 DNS SRV 기록 조회하려면 연결 문자열 에 SRV 연결 형식을 지정합니다. 이 형식을 지정하면 PHP 라이브러리가 자동으로 새 호스트를 다시 스캔합니다. 배포서버 클라이언트 구성을 변경하지 않고도 토폴로지 에 호스트를 추가할 수 있습니다.
다음 코드는 SRV 연결 형식을 사용하는 연결 문자열 보여줍니다.
$uri = 'mongodb+srv://<hostname>/';
SRV 연결 형식에 대해 자세히 학습하려면 MongoDB Server 매뉴얼의 SRV 연결 형식 항목을 참조하세요.
서버 선택 오류
다음 코드는 애플리케이션 에서 생성할 수 있는 가능한 서버 선택 오류 메시지를 보여줍니다.
No suitable servers found (`serverSelectionTryOnce` set): [connection refused calling hello on 'a.example.com:27017'] [connection refused calling hello on 'b.example.com:27017'] No suitable servers found: `serverSelectionTimeoutMS` expired: [socket timeout calling hello on 'example.com:27017'] No suitable servers found: `serverSelectionTimeoutMS` expired: [connection timeout calling hello on 'a.example.com:27017'] [connection timeout calling hello on 'b.example.com:27017'] [TLS handshake failed: -9806 calling hello on 'c.example.com:27017'] No suitable servers found: `serverselectiontimeoutms` timed out: [TLS handshake failed: certificate verify failed (64): IP address mismatch calling hello on 'a.example.com:27017'] [TLS handshake failed: certificate verify failed (64): IP address mismatch calling hello on 'b.example.com:27017']
PHP 확장은 일반적으로 이러한 오류를 MongoDB\ 드라이버\Exception\ConnectionTimeoutException 예외로 나타냅니다. 그러나 예외 메시지는 libmongoc
확장에서 사용하는 기본 시스템 라이브러리인 에서 발생합니다. 이러한 메시지는 다양한 형태를 취할 수 있으므로 애플리케이션 의 오류를 더 잘 진단할 수 있도록 메시지 구조를 세분화하는 것이 좋습니다.
메시지는 일반적으로 "적합한 서버를 찾을 수 없음"으로 시작합니다. 메시지의 다음 부분은 서버 선택이 실패한 방법 을 나타냅니다. 확장 프로그램은 서버 선택 루프를 피하고 serverSelectionTryOnce
연결 문자열 옵션에 따라 기본값 으로 한 번만 시도합니다. 확장 프로그램이 루프를 사용하도록 구성된 경우 "serverSelectionTimeoutMS expireed"라는 문구가 포함된 메시지는 시간 제한을 모두 소진했음을 나타냅니다.
메시지의 마지막 구성 요소는 서버 선택이 실패한 이유 를 알려주며 각 호스팅하다 에 대한 연결 및 모니터링 담당하는 서비스인 토폴로지 스캐너에서 직접 보내는 하나 이상의 오류를 포함합니다. 이전에 모니터링 중에 오류가 발생한 모든 호스팅하다 이 목록에 포함됩니다. 이러한 메시지는 일반적으로 낮은 수준의 소켓 또는 TLS 함수에서 발생합니다.
다음 목록에서는 마지막 오류 메시지 구성 요소에 포함된 일반적인 구문의 가능한 의미를 설명합니다.
"연결이 거부되었습니다": 원격 호스팅하다 예상 포트에서 수신 대기하지 않을 수 있습니다.
'연결 시간 초과': 라우팅 문제, 방화벽 오류 또는 지연 시간 으로 인한 시간 초과가 있을 수 있습니다.
'소켓 시간 초과': 초기 연결이 설정되었을 수 있으며, 지연 시간 으로 인해 삭제되거나 시간이 초과되었을 수 있습니다.
"TLS 핸드셰이크 실패": TLS 또는 OCSP 확인에 실패했으며, 잘못 구성된 TLS 인증서를 사용하고 있을 수 있습니다.
연결에 실패한 경우 connect
도구를 사용하여 자세한 문제 해결 정보를 확인할 수 있습니다. 이 도구는 소켓 함수를 사용하여 연결 문자열 의 각 호스팅하다 에 연결을 시도한 다음 데이터와의 상호 작용 을 시도합니다. 컴포저를 사용하여 라이브러리를 설치한 경우 다음 명령을 사용하여 connect
도구를 시작할 수 있습니다.
php vendor/mongodb/mongodb/tools/connect.php <connection URI>
연결하려는 서버 연결을 허용하지 않는 경우 출력은 다음 코드와 유사합니다.
Looking up MongoDB at <connection URI> Found 1 host(s) in the URI. Will attempt to connect to each. Could not connect to <host>:<port>: Connection refused
참고
이 도구는 mongodb://
URI 스키마 만 지원합니다. mongodb+srv
체계 사용은 지원되지 않습니다.
API 문서
MongoDB\Client
클래스 사용에 학습 보려면 다음 API 문서를 참조하세요.