2012-02-22 87 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