MongoDB への接続は単に new Mongo とするだけの簡単なものですが、 オプションや設定項目が多数あります。 Mongo::__construct() のページにすべての API オプションをまとめましたが、ここではより実用的な使用例とアドバイスをとりあげます。
MongoDB を --auth オプションつきで起動すると、 接続時の認証が必須となります。データベース単位でこれを設定するには MongoDB::authenticate() を使います。
<?php
$m = new Mongo();
$db = $m->admin;
$db->authenticate($username, $password);
?>
この方法には大きな弱点があります。 データベースとの接続が切れてしまってから再接続をしたときには、 認証されていない状態になってしまうということです。
Mongo::__construct() で説明した接続文字列形式を使えば、 接続を再確立したときにも再び認証を行うことができます。
これは上のコードと同じ意味ですが、 再接続したときにも自動的に認証を行います。
<?php
$m = new Mongo("mongodb://${username}:${password}@localhost");
?>
デフォルトでは、ユーザの認証は admin データベースに対して行います。 別のデータベースへの認証を行うには、ホスト名のあとにデータベース名を指定します。 この例は、"blog" データベースにログインします。
<?php
$m = new Mongo("mongodb://${username}:${password}@localhost/blog");
?>
レプリカセットに接続するには、セットに属するサーバをひとつ以上指定して、 さらに replicaSet オプションを使います。
<?php
$m = new Mongo("mongodb://localhost:27017", array("replicaSet" => true));
?>
バージョン 1.0.9 以降のドライバでは、レプリカセットへの接続が必須となります (それより前のバージョンでは、マスタの自動検出や再接続が正しく動作しません)。
PHP ドライバは、指定したサーバ群に問い合わせてどれがマスタなのかを調べます。 リストにあげたサーバのうち少なくともひとつに接続でき、 マスタが見つかってさえいれば接続が成功したとみなされます。 どのサーバにも接続できない、あるいはマスタが見つからないといった場合は MongoConnectionException がスローされます。
マスタが使えなくなったときに、スレーブがマスタになるには数秒かかります。 その間は、この接続では一切のデータベース操作ができなくなります (スレーブに接続して読み込みを行うことは可能です)。 したがって、このときに何らかの読み書き操作をすると例外が発生します。
新しいマスタが選ばれると、読み込みや書き込みの操作時にドライバが新しいマスタを検出できるようになります。 そして、ドライバがデータベース接続を切り替えて通常の操作を続行できるようになります。
レプリカセットについての詳細は、 » コアドキュメント を参照ください。
データベースへの接続を新たに確立させるには、非常に時間がかかります。 データベースへ接続の作成回数を最小限にするには、持続的接続を使うことができます。 持続的接続は PHP が保持するので、同じ接続を使って複数のリクエストを送ることができます。
たとえば、この単純なプログラムはデータベースに 1000 回接続します。
<?php
for ($i=0; $i<1000; $i++) {
$m = new Mongo();
}
?>
実行時間は約 18 秒です。これを、持続的接続を使うように変更してみましょう。
<?php
for ($i=0; $i<1000; $i++) {
$m = new Mongo("localhost:27017", array("persist" => "x"));
}
?>
実行時間は .02 秒未満になりました。データベースへの接続は 1 回だけしか行わないからです。
持続的接続には識別用の文字列 (上の例では "x") が必要で、これを使って接続を識別します。 持続的接続を使うには、ホスト名とポート、持続文字列、そしてユーザ名とパスワード(指定した場合) が既存の持続的接続と一致しなければなりません。 一致しない場合は、この識別情報で新しい接続を作成します。
持続的接続を使うことを強く推奨します。 実運用環境では、やむを得ぬ理由がない限り常に持続的接続を使うべきです。 リレーショナルデータベースにおいて持続的接続を推奨しない理由はいくつかありますが、 その大半は MongoDB には無関係なものです。
持続的接続は、1.0.12 でデフォルトの接続方式になりました。 持続的でない接続を作成するには、 "persist" => false を Mongo::__construct() に渡さなければなりません。
MongoDB をローカルで動かしていてバージョン 1.0.9 以降のドライバを使っている場合は、ファイル経由でデータベースに接続することができます。 MongoDB は、起動時に自動的にソケットファイル /tmp/mongodb-<port>.sock をオープンします。
ソケットファイルに接続するには、このパスを MongoDB 接続文字列に指定します。
<?php
$m = new Mongo("mongodb:///tmp/mongo-27017.sock");
?>
上で示したようなソケットファイルへの接続で認証を使いたい場合は、 ポート番号 0 を指定しなければなりません。 接続文字列のパーサは、これを接続文字列の終端と見なします。
<?php
$m = new Mongo("mongodb://username:password@/tmp/mongo-27017.sock:0/foo");
?>