разделительные блоки igbinary данных

Я сохраняю куски данных журнала в memcache для последующего выброса в базу данных. При каждом запросе к серверу я сохраняю массив данных, используя memcached :: append (), используя новые строки для разграничения фрагментов. Упрощенная версия будет выглядеть так:

$myCache->append('log', serialize($myArray)."\n");

Позже, когда я хочу создать запрос, я извлекаю все строки из базы данных и десериализирую каждую из них:

$dataToInsert = explode("\n", $myCache->get('log'));
$dataToInsert = array_map(function($row) {
return unserialize($row);
}, $dataToInsert);

Это прекрасно работает со встроенными serialize () и unserialize (), но я бы хотел воспользоваться очевидными преимуществами igbinary — размером и скоростью. К сожалению, когда я подставляю igbinary версии функций, я получаю ошибки.

Похоже, что сериализованные в igbinary данные могут содержать символы «\ n», поэтому, когда я разбираю спрятанные данные, они создают частичные строки, которые, конечно же, заканчиваются ошибкой.

Есть ли разделитель, который я могу использовать помимо новой строки для разделения блоков igbinary данных, или igbinary и append () принципиально несовместимы?

1

Решение

поскольку igbinary магазины двоичные данные как есть, нет никакой гарантии того, что какой-либо символ будет доступен для использования: вы можете сериализовать строку или целое число, содержащее любой байт, любой символ.

memcached поддерживает добавление, удаление и замену данных, а также обновление строк.

Два способа сохранить зарегистрированные данные вне памяти и в memcached, пока не придет в голову SQL-запрос:

  • использовать несколько ключей: 'log1', …, 'logN' и следить за N,
  • зарезервируйте символ для себя, избегая двоичного выхода сериализации (и удаляясь перед десериализацией).

Бронирование может быть сделано так:

str_replace( "\n", "\n1", $data ) . "\n0"

Это будет гарантировать, что каждый раз, когда есть \n на выходе,
это сопровождается либо 0 или 1,

Я не заменяю \n с \n\n потому что это не будет работать хорошо, если $data начинается или заканчивается \n,

Так:

$myCache->append('log', str_replace("\n", "\n1", igbinary_serialize($myArray)."\n0");

Разделение данных затем выполняется с помощью \n0и \n1 убегает обратно в \n:

$dataToInsert = explode("\n0", $myCache->get('log'));
$dataToInsert = array_map(function($row) {
return igbinary_unserialize(str_replace("\n1", "\n", $row));
}, $dataToInsert);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]