【问题标题】:Storing Images with Riak using PHP Client使用 PHP 客户端使用 Riak 存储图像
【发布时间】:2012-03-12 18:36:48
【问题描述】:

我已经使用 Basho 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,然后存储结果字符串?!还是有更好的办法?!

提前致谢。

【问题讨论】:

    标签: php nosql riak riak-search


    【解决方案1】:

    如果您想使用 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 二进制对象(请参阅this post)中的数据有一个 ~50mb 的上限。实际上,如果您接近该目标,您可能需要重新考虑如何存储这些图像,如果您经常访问这些图像,则需要在管道上发送大量数据,例如 NFS 或其他本地文件系统缓存可能是一个更好的主意。

    【讨论】:

    • 谢谢。我倾向于base64_encode。如果我按照自己的方式行事,我永远不会在 Riak 中存储原始图像数据。如果它们是要在线访问的图像,我会将它们放在 Rackspace Cloud Files 中,然后将它们的位置记录放在 Riak 中。如果它们是私人文件,我可能会考虑使用一些带有 fusion-io 卡的专用服务器并将图像保存在那里并进行相同的链接。但现在,我会选择你[我们的]选项。干杯。
    • 1mb 是存储在 Riak 二进制对象中的数据的推荐限制,任何超过此值的都应该考虑 Riak CS。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 2010-09-20
    • 2015-01-02
    相关资源
    最近更新 更多