Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Officially supported PHP driver for MongoDB

This branch is 450 commits behind master

Failed to load latest commit information.
.travis.scripts Remove the change to the compile script as we want streams enabled on…
api PHP-1264: Rename php_mongo_write_item fields
batch PHP-1264: Rename php_mongo_write_item fields
contrib PHP-1033: Organize third-party code and license information.
exceptions Using MongoDB, Inc. And 2014.
gridfs Fixed PHP-1090: Dereference null return value
mcon PHP on Windows does tricky things with inline, which we can't use in …
old-tests Using MongoDB, Inc. And 2014.
php/Mongo Fixed typos
tests PHP-1265: More descriptive errors for invalid db/collection names
types PHP-820: Extract MongoCollection::__construct, MongoDB::__construct, …
util Using MongoDB, Inc. And 2014.
.gitignore Sort out the includes a bit better and add support for a config.w32.h…
.travis.yml Add 5.6 to test matrix. Fix branch name PHP-1033: Organize third-party code and license information.
Makefile.frag coverage/ is a folder
Makefile.servers Enable PHP5.5 and PHP5.4 testing in travis PHP-1168: Add "How to Ask for Help" section to Github readme.
bson.c Fixed PHP-1105: long_as_object = 0 no effect.
bson.h Make cursor info() work on 32bit platforms. Update for new test directories
collection.c PHP-1265: More descriptive errors for invalid db/collection names
collection.h PHP-820: Extract MongoCollection::__construct, MongoDB::__construct, …
command_cursor.c Fixed PHP-1118: Aggregate cursor on non-existing collection throws we…
command_cursor.h PHP-972: Implement MongoCollection::parallelCollectionScan().
config.m4 Git rid of it in the config files too.
config.w32 Git rid of it in the config files too.
cursor.c PHP-1249: MongoCursor::count() should use cursor's socket timeout
cursor.h Using MongoDB, Inc. And 2014.
cursor_shared.c Make cursor info() work on 32bit platforms.
cursor_shared.h Fix build: We don't have a connection here, or that variable anyway
db.c PHP-1265: More descriptive errors for invalid db/collection names
db.h Implemented review comments.
io_stream.c Use a var to track whether we need to revert timeouts after a read
io_stream.h Using MongoDB, Inc. And 2014.
log_stream.c Fixed PHP-1052: Replace JSON encoding of stream notifications with st…
log_stream.h Using MongoDB, Inc. And 2014.
mongo.c Using MongoDB, Inc. And 2014.
mongo.h Using MongoDB, Inc. And 2014.
mongoclient.c Use PHP_VERSION_ID, as that's less fragile.
mongoclient.h Using MongoDB, Inc. And 2014.
package.xml BUMP 1.5.8
php_mongo.c Removed unused macro.
php_mongo.h Removed unused macro. Add --with-mongo-sasl to configure params

Build Status


To build and install the driver:

sudo make install

Then, add the following to your php.ini file:

Enabling enterprise features

To connect to MongoDB Enterprise using SASL (GSSAPI) or LDAP (PLAIN) you need to build the driver against cyrus-sasl2 (external library). This is done by passing --with-mongo-sasl to ./configure, optionally passing in the directory to where cyrus-sasl2 was installed:

./configure --with-mongo-sasl=/usr/local
sudo make install

Installing on Windows

Windows builds are available through

Builds for older driver versions may be found through

Each driver release includes various builds to support specific versions of PHP and Windows. Select the correct DLL file for your environment, and add the following to your php.ini file (VERSION will vary by environment):


If the DLL is not located within the directory specified by the extension_dir INI setting, you may need to specify its full path.


See the PHP manual.

How To Ask For Help

When asking for support, or while providing feedback in the form of bugs or feature requestes, please include the following relevant information:

  • Detailed steps on how to reproduce the problem, including a script that reproduces your problem, if possible.
  • The exact PHP version used. You can find this by running php -v on the command line, or by checking the output of phpinfo(); in a script requested through a web server.
  • The exact version of the MongoDB driver for PHP. You can find this by running php --ri mongo | grep Version on the command line, or by running a script containing <?php echo phpversion("mongo"); ?>.
  • The operating system and version (e.g. Windows 7, OSX 10.8, ...).
  • How you installed the driver, either via your distribution's package management, with "brew", with an *AMP installation package, or through a manual source compile and install.
  • With connection and replica set selection issues, please also provide a full debug log. See further down on how to make one.

Support / Feedback

For issues with, questions about, or feedback for the PHP driver, please look into our support channels. Please do not email any of the PHP driver developers directly with issues or questions—you're more likely to get an answer on the mongodb-user list on Google Groups.

Bugs / Feature Requests

Think you have found a bug? Want to see a new feature in the driver? Please open a case in our issue management tool, JIRA:

Bug reports in JIRA for all driver projects, as well as for the MongoDB server project, are public. Please do not add private information to bug reports.

Security Vulnerabilities

If you’ve identified a security vulnerability in a driver or any other MongoDB project, please report it according to the instructions here.


The tests are not available as part of the PECL package, but they are available on Github.

See for how to run and create new tests.

Full debug log

You can make a full debug log by using the following code:

 * This script will catch all internal driver logging for MongoDB and log them
 * to a file /tmp/MONGO-PHP-LOG.<unix-timestamp>. This log will give the
 * driver developers more or less all the information they'll need to debug
 * this issue

function module2string($module)
    switch ($module) {
        case MongoLog::RS: return "REPLSET";
        case MongoLog::CON: return "CON";
        case MongoLog::IO: return "IO";
        case MongoLog::SERVER: return "SERVER";
        case MongoLog::PARSE: return "PARSE";
        default: return $module;

function level2string($level)
    switch ($level) {
        case MongoLog::WARNING: return "WARN";
        case MongoLog::INFO: return "INFO";
        case MongoLog::FINE: return "FINE";
        default: return $level;

function logMongo($module, $level, $message, $save = false) {
    static $log = "";
    $log .= sprintf("%s :: %s (%s): %s\n", date('Y-m-d H:i:s',time()), module2string($module), level2string($level), $message);

    if ($save) {
        file_put_contents("/tmp/MONGO-PHP-LOG." . time(), $log);
        $log = "";

function saveMongoLog($errno, $errstr, $errfile, $errline, $errctx) {
    $modules = array(
        MongoLog::RS, MongoLog::CON, MongoLog::IO, MongoLog::SERVER, MongoLog::PARSE,
    foreach($modules as $const) {
        if (strncmp($errstr, module2string($const), strlen(module2string($const))) == 0) {
            logMongo($const, "HANDLER", $errstr);
            return true;
    return false;

function saveMongoLogException($ex) {
    if ($ex instanceof MongoException) {
        $msg = sprintf("Uncaught exception: %s, %s\n",  get_class($ex), $ex->getMessage());
        logMongo(get_class($ex), "ERROR", $ex->getMessage(), true);
    throw $ex;



/* If an global exception handler is used, or a default exception handler is
 * already registered, please comment out this line and put into your catch
 * block: saveMongoLogException($exception); */


Jon Moss

  • Came up with the idea and implemented MongoCursor implementing Iterator

Pierre-Alain Joye

  • Helped build the Windows extension and has provided the VC6 builds

Cesar Rodas

  • Created the MongoCursor::info method
  • Implemented GridFS read streaming

William Volkman

  • Made connection code check & handle error status

Derick Rethans

  • Implemented MongoInt32, MongoInt64 and related php.ini options.

Taneli Leppä

  • Provided a patch for PHP-706 to swap out select() for poll().
Something went wrong with that request. Please try again.