1. USING RIAK WITH PHP
Front Range PHP Users Group - May 12th, 2010
Jon Meredith - Basho Technologies
jmeredith@basho.com / @jon_meredith
2. RIAK BY EXAMPLE
• URL Shortener Example in PHP (thx Sean Cribbs)
• Creates a short URL that redirects to the real thing
• Demonstrates buckets, get and put.
4. ON POST
<?php
include_once "riak.php";
// snip...
// Responding to a post
} elseif (isset($_POST['url'])) {
$url = $_POST['url'];
$shtn = shorten($url);
$client = new RiakClient('localhost', 8098);
$bucket = $client->bucket('shtn');
$object = $bucket->newBinary($shtn, $url, 'text/plain');
$object->store();
}
?>
5. ON GET
if ($_SERVER["REQUEST_METHOD"] == 'GET' and
isset($_SERVER["PATH_INFO"])) {
$client = new RiakClient('localhost', 8098);
$bucket = $client->bucket('shtn');
$path_els = explode('/', $_SERVER["PATH_INFO"]);
$key = $path_els[1];
$obj = $bucket->getBinary($key);
if ($obj->exists())
{
$lurl = $obj->getData();
header("Location: $lurl");
exit;
}
else
{
$notice = "Unknown redirect for $key";
}
}
6. STUPID COLLISION PRONE SHORTENER
DO NOT USE
// cheap and cheerful shortener - takes hash with crc32,
// converts to base64 and trims non a-zA-Z0-9 characters
function shorten($url) {
$hash = hash("crc32", $url, true);
$str = base64_encode($hash);
return preg_replace('/[^a-zA-Z0-9]/', '', $str);
}
8. RIAK & PHP
• PHP client http://bitbucket.org/basho/riak-php-client
• Uses Riak’s RESTful HTTP interface
• Pure PHP - requires the cURL module to be installed
9. RIAK PHP API
• RiakClient - a connection to a single server
• RiakBucket - access to bucket properties/objects stored
• RiakObject - a key/value/metadata object
10. RIAK MATH
•N - number of replicas
•R - number of reads
•W - number of writes
• DW - durable writes
• As long as R+W > N you read your writes
11. RIAKCLIENT CLASS
• Create connection to a server
$client = new RiakClient(HOST, PORT);
assert($client->isAlive());
• Create a RiakBucket object
$bucket = $client->bucket('bucket');
• Get/Change Defaults
$client->getR(); $client->getW(); $client->getDW();
$client->setR(1); $client->setW(3); client->setDW(1);
$
12. RIAK BUCKETS
• Buckets group related keys together.
• Finest level you can configure Riak at
•n value - number of replicas
• allow_mult - return conflicts to client
• r/w/dw - successful reads/writes/durable writes
15. RIAK OBJECTS
• RiakObjects hold bucket name, keys, values and metadata.
• Metadata includes content type and links.
• By default objects serialize using JSON
... can prevent using ‘binary’ objects
$bucket->getBinary($key); $bucket->newBinary($key);
17. MORE RIAKOBJECT
• Store on server
$obj->store();
• Reload from server
$obj->reload();
• Delete from server
$obj->delete();
• Clear contents data/metadata (but not bucket/key/vclock)
$obj->clear();
18. LINKS
•A Link store a one-way relationship between two objects,
similar to a hyperlink.
•A link is a bucket & key plus a user-supplied tag.
• Objects can have multiple links.
• Riak
supports link walking - server side
- match on bucket or tag
21. LINK WALKING
• Walk the links
$resultObjects = $object->link($bucket='_', $tag='_', $keep=FALSE);
$bucket - match on a bucket name, '_' matches all
$tag - match on a link tag, '_' matches all
$keep - return results - last link always TRUE.
• Examples
// Dean’s links array of $alice, $bob, $claire, $claire (duplicate)
$deans_links = $dean->link('_')->run();
// Dean’s friends array of $bob, $claire
$deans_friends = $dean->link('_','friend')->run();
// Dean’s VIPs array of $claire
$deans_vips = $dean->link('vip’)->run();
// Friends of Dean’s friends array of $alice
$deans_fofs = $dean->link('_','friend')->link('_','friend')->run();
// friends within 2 degrees of separation - array(array($bob, $claire), $alice)
$deans_2degs = $dean->link('_','friend', TRUE)->link('_','friend', TRUE)->run();
22. LINK WALKING DEMO
• http://github.com/schofield/riak_php_app
• Created by Grant Schofield, Developer Advocate @ Basho
23. RIAK MAP/REDUCE
• Map/Reduce allows you to query Riak
• Map function selects/transforms data you want
• Reduce function combines the output of the map function
• Provide your own functions (in erlang or javascript) or use the
builtins