Мне было интересно, как мне начать писать слой данных XML для довольно простого php-сайта. Причины этого:
- сервер базы данных недоступен.
- Простая схема данных, которая может быть выражена в xml.
- Мне нравится идея иметь автономное приложение без серверных зависимостей.
- Возможно, я бы хотел абстрагировать его от небольшой структуры для повторного использования в других проектах.
Схема напоминает простой каталог книг с несколькими справочными таблицами плюс i18n. Так что это довольно просто выразить.
Размер основного файла XML находится в диапазоне от 100 КБ до 15 МБ. Но в какой-то момент он может вырасти до ~ 100 МБ.
На самом деле я рассматриваю возможность расширения моих классов моделей для обработки XML-данных.
В настоящее время я получаю данные с помощью комбинации XMLReader и SimpleXml, например:
public function find($xpath){
while($this->xml_reader->read()){
if($this->xml_reader->nodeType===XMLREADER::ELEMENT &&
$this->xml_reader->localName == 'book' ){
$node = $this->xml_reader->expand();
$dom = new DOMDocument();
$n = $dom->importNode($node, true);
$dom->appendChild($n);
$sx = simplexml_import_dom($n);
// xpath returns an array
$res = $sx->xpath($xpath);
if(isset($res[0]) && $res[0]){
$this->results[] = $res;
}
}
return $this->results;
}
Таким образом, вместо загрузки всего файла XML в память, я создаю объект SimpleXml для каждого раздела и запускаю запрос xpath для этого объекта. Функция возвращает массив объектов SimpleXml. Для консервативного поиска я бы, вероятно, разбил первый найденный предмет.
Вопросы, которые я должен задать:
- Считаете ли вы это жизнеспособным решением даже для хранилищ данных среднего и большого размера?
- Есть ли какие-то соображения / шаблоны, которые следует учитывать при обработке XML в PHP?
- Масштабируется ли код выше для больших файлов (100 МБ)?
- Можно ли обрабатывать вставки и обновления в больших XML-файлах с минимальными издержками?
- Вы бы предложили альтернативный формат данных как лучший вариант?