Хранение изображений в Riak с использованием PHP-клиента

Я использую 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 изображение, а затем сохранить полученную строку?! Или есть лучший способ?!

Заранее спасибо.


person BannerMan    schedule 22.02.2012    source источник


Ответы (1)


Вы можете использовать RiakBucket::newBinary() и RiakBucket::getBinary(), если хотите хранить незакодированные двоичные данные в Riak с клиентом PHP.

$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) в целом ставит бинарный подход впереди.

Изменить: также обратите внимание, что существует верхний предел ~ 50 МБ для данных, хранящихся в двоичном объекте Riak (см. riak">этот пост) из-за ограничений в бэкенде Erlang. На самом деле, если вы приближаетесь к этому, вы можете переосмыслить, как вы храните эти изображения, это много данных для отправки по каналу, если вы часто к ним обращаетесь, что-то вроде NFS или другого кэша локальной файловой системы. наверное, лучшая идея.

person MightyE    schedule 23.02.2012
comment
Спасибо. Я склонялся к base64_encode. Будь моя воля, я бы никогда не хранил необработанные данные изображения в Riak. Если это изображения, к которым можно получить доступ в Интернете, я бы поместил их в Rackspace Cloud Files, а затем добавил запись об их местонахождении в Riak. Если бы это были частные файлы, я бы, вероятно, подумал о том, чтобы получить несколько выделенных серверов с картами fusion-io, сохранить изображения там и сделать то же самое. Но пока я выберу твой [наш] вариант. Ваше здоровье. - person BannerMan; 24.02.2012
comment
1 МБ — это рекомендуемый предел для данных, хранящихся в двоичном объекте Riak, все, что выше этого, и вам следует рассмотреть Riak CS. - person bryan_basho; 18.11.2014