This document demonstrates using Riak with PHP by providing an example of a URL shortener application. It shows how to create a Riak client, store and retrieve objects from buckets, and use links to connect objects. Key aspects of the Riak PHP client API are also summarized, including working with Riak clients, buckets, objects, links, and map/reduce queries.
1 of 28
Downloaded 105 times
More Related Content
PHP API
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