Docs Menu
Docs Home
/ / /
PHP ライブラリ マニュアル
/

接続ターゲットの選択

このガイドでは、接続string と {0MongoDB\Client オブジェクトを使用して、さまざまなタイプのMongoDB 配置に接続する方法を説明します。

MongoDBAtlas上の 配置に接続するには、 接続string に次の要素を含めます。

  • Atlas クラスターの URI

  • データベースユーザー名

  • データベースユーザーのパスワード

次に、接続stringを MongoDB\Client コンストラクターに渡します。

Atlas に接続するときは、Atlas が MongoDB Server の新しいバージョンにアップグレードするときに重大な変更を回避するために、 Stable API クライアント オプションを使用することをお勧めします。 Stable API 機能について詳しくは、 Stable API ページ をご覧ください。

次のコードは、 PHPライブラリを使用して Atlas クラスターに接続する方法を示しています。 このコードでは、Stable APIバージョンを指定するためにserverApiオプションも使用されます。

<?php
// 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';

Tip

クイック スタートの 接続stringの作成 の手順に従って、 接続文字stringを取得します。

MongoDB のローカル配置に接続するには、ホスト名としてlocalhostを使用します。 デフォルトでは、 mongodプロセスはポート27017で実行されますが、これは配置に合わせてカスタマイズできます。

次のコードは、 PHPライブラリを使用してローカルMongoDBデプロイに接続する方法を示しています。

<?php
$uri = 'mongodb://localhost:27017';
$uriOptions = ['serverSelectionTimeoutMS' => 10000];
$client = new MongoDB\Client($uri, $uriOptions);

レプリカセットに接続するには、IP 接続 でレプリカセットのホスト名(またはstring アドレス)とポート番号を指定します。

レプリカセットレプリカセットの 1 つ以上のホストを指定し、 PHPライブラリに自動検出を実行して他のホストを検索するように指示できます。 ドライバーに自動検出を実行するように指示するには、次のいずれかのアクションを選択します。

  • replicaSet パラメーターの値としてレプリカセットの名前を指定します。

  • directConnection パラメーターの値として false を指定します。

  • レプリカセットに複数のホストを指定します。

次の例では、ドライバーはサンプル接続 URI を使用して、host1 を含む 3 つの異なるホストのポート 27017 で実行されている MongoDB レプリカセット sampleRS に接続します。

<?php
$uri = 'mongodb://host1:27017/?replicaSet=sampleRS';
// Create a MongoDB client
$client = new MongoDB\Client($uri);

レプリカセットを初期化するには、単一のノードに直接接続する必要があります。 そのためには、 接続stringで directConnection 接続オプションを true に設定します。 次のコード例は、この接続オプションを設定する方法を示しています。

<?php
// 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エンドポイントは 1 つだけです。この場合、レプリカセットは検出できません。接続 URI で directConnection=false を指定するか、このオプションを未設定のままにすると、アプリケーションがその接続に接続できなくなる可能性があります。

テスト環境または開発環境では、directConnection=true を指定してレプリカセットに接続できます。本番環境では、Docker 仮想ネットワークの外部から各 MongoDB インスタンスにアクセスできるようにクラスターを構成することを推奨します。

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']

The PHP拡張機能は通常、これらのエラーをMongoDB\Driver\Exception\ConnectionTimeoutException 例外として表します。ただし、例外メッセージは、拡張機能で使用される基礎のシステム ライブラリである libmongoc から送信されます。これらのメッセージはさまざまな形式になる可能性があるため、アプリケーションのエラーをより良く診断できるようにメッセージの構造を分析することをお勧めします。

メッセージは通常、「適切なサーバーが見つかりません」で始まります。メッセージの次の部分は、サーバー選択がどのように失敗したかを示しています。この拡張機能はサーバー選択ループを回避し、 接続文字列オプションに従ってデフォルトで 1 回の試行を実行します。拡張機能がserverSelectionTryOnce ループを使用するように構成されている場合、"serverSelectionTimeoutMS expired" というフレーズを含むメッセージは、時間制限を使い果たしたことを示します。

メッセージの最後のコンポーネントは、サーバー選択が失敗した理由を示しており、トポロジースキャナー(各ホストへの接続と監視を担当するサービス)から直接の 1 つ以上のエラーが含まれています。以前にモニタリング中にエラーが発生したホストがこのリストに含まれます。これらのメッセージは通常、低レベルのソケットまたは TLS 関数から送信されます。

次のリストでは、最後のエラー メッセージ コンポーネントに含まれる一般的なフレーズの意味を説明します。

  • 「接続を拒否しました」: リモート ホストが予期されたポートでリッスンしていない可能性があります。

  • "Connection timeout": ルーティングの問題、ファイアウォールエラー、またはレイテンシによるタイムアウトが発生する可能性があります。

  • 「ソケット タイムアウト」:レイテンシにより切断またはタイムアウトされた初期接続を確立した可能性があります。

  • 「TLS ハンドシェイクに失敗しました」: TLS または OCSP 検証が成功しなかったため、誤った TLS 証明書を使用している可能性があります。

接続が失敗した場合は、connect ツールを使用して詳細なトラブルシューティング情報を取得できます。このツールは、ソケット関数を使用して接続文字列内の各ホストに接続し、データのやり取りを試みます。 Composer を使用してライブラリをインストールした場合は、次のコマンドを使用して 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 スキームの使用はサポートされていません。

MongoDB\Clientクラスの使用の詳細については、次のAPIドキュメントを参照してください。

戻る

クライアントの作成

項目一覧