Я сохраняю куски данных журнала в 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 () принципиально несовместимы?
поскольку 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);
Других решений пока нет …