PHP CouchDB Extension

August 11, 2010 at 09:00 AM | categories: PHP, CouchDB | View Comments

The CouchDB extension allows PHP developers to easily manipulate CouchDB documents stored on CouchDB servers using an object-oriented API. The extension implements most of the CouchDB API with the ultimate goal being full support. The server JSON responses are automatically decoded into native PHP objects or arrays.

Development is on Github you can pull the source from there.

Features

  • Supports the largest part of the CouchDB API (Database API, Document API, View API, Bulk Document API).
  • Supports both Cookie and Basic authentication.
  • Supports built in encoding and decoding of JSON.
  • Supports replication.
  • Supports server functions (configuration, status, stats).
  • Supports user management.

Download

Download

Installation

Using pecl command

Download the source

Run the command

pecl install couchdb-0.0.2a.tgz

Add "extension=couchdb.so" to your php.ini file

Using sources

Download the source Unpack the tarball

tar xzvf couchdb-0.0.2a.tgz

Enter the source directory and run

phpize && ./configure && make && make install

Add "extension=couchdb.so" to your php.ini file.

Build into PHP

Download the source Unpack the tarball to the PHP extensions dir

tar xzvf couchdb-0.0.2a.tgz -C $PHP_SOURCE/ext/"

Reconfigure the PHP source

rm configure && ./buildconf –force

Configure php with

./configure –enable-couchdb

Use

The documentation is still a work in progress can be found here, help in expanding the documentation is welcome.

Example

The following example is included in the source tarball, provides some guideline on using the extension.

<?php
/* $ Id: */
/*
Examples on how to use the PHP CouchDB extension
*/

/* Create the CouchdbClient object
The url can support authentication as well 
- http://user:password@localhost:5984

- Authentication is both by basic and cookie
To use cookie authentication you need to set use_cookie_auth to true
 CouchdbClient("http://user:pass@localhost:5984",true);

The url could be https
- https://localhost:5984
You may have to set the CA info using CouchdbClient::setCAPath()

*/
try {
    $conn = new CouchdbClient("http://localhost:5984");
    print "Creating Database test_database :";
    if($conn->createDatabase("test_database")){
        print "PASS\n";
    }else{
        print "FAIL\n";
    }
    echo "Getting Database list\n";
    $result = $conn->listDatabases();
    print_r($result);
    print "===========================\n";
    print "Selecting Database test_database\n";
    $conn->selectDB("test_database");
    print "===========================\n";
    print "Getting Database info\n";
    $result = $conn->getDatabaseInfo();
    print_r($result);
    print "===========================\n";
    print "Store document to DB\n";
    /* The document can be created in multiple ways
   - PHP stdclass object
   - PHP array
   - JSON encoded string

   # Using PHP stdclass
   $new_doc = new stdClass();
   $new_doc->title = "New content";
   $new_doc->_id = "BlogPost65";

   # Using PHP array
   #$new_doc = array(_id=>Blogpost65,title=>"New content");

   # Using JSON string
   $new_doc = '{"_id":"Blogpost65","title":"New content"}';
   */
    $new_doc = '{"_id":"Blogpost65","title":"New content"}';
    $last_result = $conn->storeDoc($new_doc);
    print_r($last_result);
    print "===========================\n";
    print "Store multiple documents to the DB\n";
    $new_docs = array(
        array('type'=>'blogpost','title'=>'post'),
        array('type'=>'blogcomment','blogpost'=>'post','depth'=>1),
        array('type'=>'blogcomment','blogpost'=>'post','depth'=>2)
        );
    $result = $conn->storeDocs($new_docs);
    print_r($result);
    print "===========================\n";
    /* run in the examples directory or change the filename */
        print "Store attachment to DB\n";
    try {
        $result = $conn->storeAttachment("PHP_LOGO","./php.gif","php.gif","image/gif");
        print_r($result);
    } catch (CouchdbClientException $f) {
        echo $f->getMessage()."\n";
    }
    print "===========================\n";  
    print "Copy document to another document\n";
    $result = $conn->copyDoc("Blogpost65","Blogpost66");
    print_r($result);
    print "===========================\n";
    print "Get all documents in DB\n";
    $result = $conn->getAllDocs();
    print_r($result);
    print "===========================\n";
    print "Run a temp view query\n";
    $view = '{"map" : "function(doc) { if (doc.title==\'New content\') { emit(null, doc); } }"}';
    $result = $conn->getTempView($view);
    print_r($result);
    print "===========================\n";
    print "Delete a document\n";
    $conn->deleteDoc("Blogpost65",$last_result->rev);
    $result = $conn->getLastResponse(true);
    print_r($result);
    print "===========================\n";
    print "Compacting Database :";
    if($conn->compactDatabase())
        print "PASS\n";
    else
        print "FAIL\n";
    print "===========================\n";
    print "Getting updated Database info\n";
    $result = $conn->getDatabaseInfo();
    print_r($result);
    print "===========================\n";
    print "Create the replica database - test_replica_database :";
    if($conn->createDatabase("test_replica_database"))
        print "PASS\n";
    else
        print "FAIL\n";
    print "Start Database replication\n";
    $result = $conn->startReplication("test_database","test_replica_database");
    print_r($conn->getLastResponse(true));
    print "===========================\n";
    #print "Sleeping 5 seconds to allow replication to start\n";
    #sleep(5);
    #print "===========================\n";
    print "Drop the database :";
    if($conn->deleteDatabase("test_database"))
        print "PASS\n";
    else
        print "FAIL\n";
    print "===========================\n";
    print "Drop the replica database :";
    if($conn->deleteDatabase("test_replica_database"))
        print "PASS\n";
    else
        print "FAIL\n";
    print_r($conn->getLastResponse(true));
    print "===========================\n";
} catch(CouchdbClientException $e) {
    echo $e->getMessage();
}    
unset($conn);
?>

Feedback

Please send all requests, bug reports etc to topdog@fedoraproject.org


blog comments powered by Disqus