2012-02-22 88 views
3

我一直在使用Basho Riak几周。我只需要存储字符串数据。使用PHP客户端使用Riak存储图像

不过,我看用它来存储图片,我想了一些想法,我怎么可以用PHP客户做到这一点。

下面是基本的代码来存储数据:

require_once('riak-php-client/riak.php'); 

# Connect to Riak 
$client = new RiakClient('127.0.0.1', 8098); 

# Choose a bucket name 
$bucket = $client->bucket('test'); 

# Supply a key under which to store your data 
$person = $bucket->newObject('string_key', 'string_data'); 

# Save the object to Riak 
$person->store(); 

难道我只是BASE64_ENCODE的图像,然后保存生成的字符串?或者,还有更好的方法?!

在此先感谢。

回答

5

如果您想用PHP客户端将未编码的二进制数据存储到Riak中,您需要使用RiakBucket::newBinary()RiakBucket::getBinary()

$image = file_get_contents("images/TagLabs-Logo-White-240x60.png"); 
$md5 = md5($image); 

$riak->bucket("test") 
    ->newObject("image_base64", base64_encode($image)) 
    ->store(); 

$riak->bucket("test") 
    ->newBinary("image_raw", $image, 'image/png') 
    ->store(); 

$b64Read = $riak->bucket("test")->get("image_base64"); 
echo "B64 md5 comparison: original=$md5, b64=".md5(base64_decode($b64Read->getData()))."\n"; 
$rawRead = $riak->bucket("test")->getBinary("image_raw"); 
echo "Raw md5 comparison: original=$md5, raw=".md5($rawRead->getData())."\n"; 

生成输出:

B64 md5 comparison: original=6749cfaf1516b01db9792e119d53177a, b64=6749cfaf1516b01db9792e119d53177a 
Raw md5 comparison: original=6749cfaf1516b01db9792e119d53177a, raw=6749cfaf1516b01db9792e119d53177a 

在我的性能测试中,这两种方法都基本上是从了Riak的角度相同的开销。花费在base64编码/解码上的循环(加上引擎盖下的base64数据然后被json编码/解码)使得二进制方法总体上领先。

编辑:另请注意,由于Erlang后端的限制,存储在Riak二进制对象中的数据的上限为50mb(见this post)。实际上,如果你在任何地方靠近,你可能想重新思考你如何存储这些图像,如果你经常访问那些管道,那么管道上发送的数据很多,像NFS或其他本地文件系统缓存可能更好一些。

+0

谢谢。我倾向于base64_encode。如果我有自己的方式,我绝不会将原始图像数据存储在Riak中。如果它们是要在线访问的图像,我会将它们放入Rackspace Cloud Files中,然后在Riak中记录它们的位置。如果他们是私人文件,我可能会考虑使用fusion-io卡获得一些专用服务器,并将图像保存在那里并进行相同的链接。但现在,我会选择y(我们)。干杯。 – 2012-02-24 04:08:31

+0

1mb是存储在Riak二进制对象中的数据的推荐限制,任何高于此值的数据都应该考虑使用Riak CS。 – 2014-11-17 23:25:35