Пишу, по большей части, про историю, свою жизнь и немного про программирование.

ЖЖ от 2007-06-19 13:19:00

Даже не думайте связываться с QDBM на PHP. При одновременной записи в базу с блокировкой ’d’ (т. е. блокируется файл базы) файл портится на посещаемом проекте за время от нескольких часов, до нескольких минут, с блокировкой ’l’ и того хуже — lock может и не очиститься при выходе и процессы PHP начинают подвисать, ожидая снятия блокировки. При этом на одном сервере при попытке открыть битый файл падает PHP, на другом — PHP выдаёт ошибку драйвера qdbm.

Кстати, лимит базы QDBM почему-то 2GB, а не 4 (размер поля, где хранится размер базы — int, платформа у нас — 32 bit), понятно, что база не может быть отрицательного размера, так что ничего не мешает использовать uint, править руками не буду, если бы она работала стабильно, был бы смысл.

Конечно, можно было бы использовать QDBM в некоторых задачах как константную базу данных, но в этом смысле, если верить benchmarks, лучше взглянуть на CDB]] (от автора qmail!). Кстати, CDB в PHP удалось собрать только как bundled, сборка с библиотеками D. J. Bernstein или Михаила Токарева (TinyCDB) пораждает массу ошибок.

Что остаётся? Остальные файловые БД безнадёжно далеки от лидеров CDB и QDBM. Попробовать SQLite?

P.S. Засада — SQLite3 не хочет заносить символ с кодом ноль в BLOB-поле. Они издеваются? В модуле SQLite к PHP есть функция sqlite_udf_encode_binary для таких случаев — она кодирует специальным образом (вот изврат-то), преобразуя данные в безопасный для SQLite формат. Но модуль SQLite работает только с SQLite2. С SQLite3 в PHP принято работать через PDO, который имеет методы quote/bindValue и методы работы с LOB, которые плюют на кривожопие SQLite и оставляют NUL как есть.