Tuesday, April 2, 2013

Couchbase, PHP, XAMPP and Windows

A while ago I blogged about Couchbase, PHP and IIS, and earlier today I got a request for more information on how to do the same with XAMPP.

After I downloaded the installer and installed XAMPP in c:\xampp I downloaded one of my development builds of the php extension. Please note that this is a development build I've used for simple testing for myself, and I provide it AS IS WITHOUT ANY WARRANTIES so use it on your own risk (and not in production ;) ).

To "install" the extension, extract the zipfile and execute the following commands from within that directory:

copy php_couchbase.dll c:\xampp\php\ext
copy libcouchbase.dll c:\xampp\php
copy libcouchbase.dll c:\xampp\apache\bin

Use the XAMPP Control panel to edit the php.ini file, and enable the extension by adding:

[couchbase]
extension=php_couchbase.dll

(You may also change other tunables. See couchbase.ini for a full list).

(Re)start the Apache server from the XAMPP Control panel, and start writing code using the PHP extension. You'll find a description of the API in the file couchbase-api.php

Happy hacking!

Monday, April 1, 2013

Building Couchbase PHP driver on Ubuntu

I've been testing our PHP connector on Ubuntu lately, so I thought I should tell all of you how I'm doing this. I know a lot of people prefer to run Linux on their desktop, but I don't have any boxes running Linux at home. What I do have is a server running SmartOS, which makes it really easy to spin up new virtual machines with "any" operating system I'd like to test.

The first thing I do on my SmartOS server is to create a manifest file for my new vm. This manifest file is a JSON file describing the vm, and yesterday I was going to build on Ubuntu 12 so I created a file named ubuntu12.json looking like this:

{
   "brand": "kvm",
   "vcpus": 1,
   "autoboot": false,
   "alias": "ubuntu12",
   "ram": 1024,
   "resolvers": ["10.0.0.1"],
   "disks": [
      {
         "boot": true,
         "model": "virtio",
         "size": 10240
      }
   ],
   "nics": [
      {
         "nic_tag": "admin",
         "model": "virtio",
         "ip": "10.0.0.251",
         "netmask": "255.255.255.0",
         "gateway": "10.0.0.1"
      }
   ]
}

with that in place I created the virtual machine with the following command:

[root@smartos ~] # vmadm create -f ubuntu12.json
Successfully created 3d09ad09-e124-4b68-90fd-53c76f05dbc0

The next thing I did was to copy the Ubunto 12.10 installation iso file to /zones/3d09ad09-e124-4b68-90fd-53c76f05dbc0/root/cdrom.iso, before I executed the following command:

[root@smartos ~] # vmadm boot 3d09ad09-e124-4b68-90fd-53c76f05dbc0 order=cd,once=d cdrom=/cdrom.iso,ide

This boots the vm and provides a "console" to the machine over vnc. To figure out where to connect the vncviewer to complete the installation I executed:

root@smartos ~]# vmadm info 3d09ad09-e124-4b68-90fd-53c76f05dbc0 vnc
{
  "vnc": {
    "host": "10.0.0.22",
    "port": 39944,
    "display": 34044
  }
}

With my Ubuntu 12.10 installed the first thing I did was to install some extra packages:

trond@ubuntu12:~$ sudo wget -O/etc/apt/sources.list.d/couchbase.list http://packages.couchbase.com/ubuntu/couchbase-ubuntu1204.list
trond@ubuntu12:~$ wget -O- http://packages.couchbase.com/ubuntu/couchbase.key | sudo apt-key add -
trond@ubuntu12:~$ sudo apt-get update
trond@ubuntu12:~$ sudo apt-get install openssh-server php5-dev php5-cli libcouchbase2 libcouchbase2-libevent libcouchbase2-bin libcouchbase-dev
trond@ubuntu12:~$ wget -Orepo https://git-repo.googlecode.com/files/repo-1.19
trond@ubuntu12:~$ chmod a+x repo
trond@ubuntu12:~$ sudo cp repo /usr/bin

I can now build the php extension by running:

trond@ubuntu12:~$ mkdir compile
trond@ubuntu12:~$ cd compile
trond@ubuntu12:~/compile$ repo init -u git://github.com/trondn/manifests -m php.xml
trond@ubuntu12:~/compile$ repo sync
trond@ubuntu12:~/compile$ cd php
trond@ubuntu12:~/compile/php$ phpize
trond@ubuntu12:~/compile/php$ ./configure
trond@ubuntu12:~/compile/php$ make
trond@ubuntu12:~/compile/php$ cd tests
trond@ubuntu12:~/compile/php/tests$ cp couchbase.local.inc.dist couchbase.local.inc
trond@ubuntu12:~/compile/php/tests$ vi couchbase.local.inc

Now you should specify the hostname of your Couchbase cluster in COUCHBASE_CONFIG_HOST, and clear (or specify correct values) for COUCHBASE_CONFIG_USER and COUCHBASE_CONFIG_PASSWD).

trond@ubuntu12:~/compile/php/tests$ cd ..
trond@ubuntu12:~/compile/php$ make test

Depending on your cluster configuration you might encounter some test errors (the tests are unfortunately not written fully bullet proof). If you have a one-node cluster with a replica count set to 1, the following tests will fail (because they don't check for "inconsistent" configuration):

GetReplica - GetReplica [tests/phpt/GetReplica/GetReplica.phpt]
GetReplica - GetReplicaMulti [tests/phpt/GetReplica/GetReplicaMulti.phpt]

You can now install the driver by:

trond@ubuntu12:~/compile/php$ sudo cp modules/couchbase.so /usr/lib/php5/20100525
trond@ubuntu12:~/compile/php$ sudo cp example/couchbase.ini /etc/php5/cli/conf.d

And verify that it is properly installed by running:

trond@ubuntu12:~/compile/php$ php -i | grep couchbase
/etc/php5/cli/conf.d/couchbase.ini
couchbase
couchbase support => enabled
couchbase.compression_factor => 1.3 => 1.3
couchbase.compression_threshold => 2000 => 2000
couchbase.compressor => none => none
couchbase.durability_default_poll_interval => 100000 => 100000
couchbase.durability_default_timeout => 40000000 => 40000000
couchbase.instance.persistent => On => On
couchbase.restflush => On => On
couchbase.serializer => php => php
couchbase.view_timeout => 75 => 75

So let's go ahead and create a small test using our driver. Create the file test.php with the following content:

<?php
  try {
     $cb = new Couchbase("mycluster");
     print "Store foo: " . $cb->set("foo", "bar") . "\n";
     print "Get foo: " . $cb->get("foo") . "\n";
  } catch (CouchbaseException $e) {
     var_dump($e);
  }
?>

And test it with the following command:

trond@ubuntu12:~/compile/php$ php test.php
Store foo: 14566767818228433408
Get foo: bar

Happy hacking!!!