XML как уровень данных для приложения PHP - PullRequest
4 голосов
/ 04 апреля 2009

Мне было интересно, как мне начать писать слой данных XML для довольно простого php-сайта. Причины этого:

  1. сервер базы данных недоступен.
  2. Простая схема данных, которая может быть выражена в xml.
  3. Мне нравится идея иметь автономное приложение без серверных зависимостей.
  4. Возможно, я бы хотел абстрагировать его от небольшой структуры для повторного использования в других проектах.

Схема напоминает простой каталог книг с несколькими справочными таблицами плюс 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. Для консервативного поиска я бы, вероятно, разбил первый найденный предмет.

Вопросы, которые я должен задать:

  1. Считаете ли вы это жизнеспособным решением даже для хранилищ данных среднего и большого размера?
  2. Есть ли какие-то соображения / шаблоны, которые следует учитывать при обработке XML в PHP?
  3. Масштабируется ли код выше для больших файлов (100 МБ)?
  4. Можно ли обрабатывать вставки и обновления в больших XML-файлах с минимальными издержками?
  5. Вы бы предложили альтернативный формат данных как лучший вариант?

Ответы [ 4 ]

5 голосов
/ 04 апреля 2009

Если у вас есть пила, и вам нужно стучать в гвоздь, не используйте увидел. Получи молоток. (народная поговорка)

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

PHP имеет хорошую поддержку для различных систем баз данных через PDO ; для небольших наборов данных вы можете использовать SQLite, который не нуждается в сервере (он хранится в обычном файле). Позже, если вам нужно переключиться на полнофункциональную базу данных, это довольно просто.

Чтобы ответить на ваши вопросы:

  1. Жизнеспособное решение - нет, определенно нет. У XML есть свои цели, но имитация базы данных - это не одно даже для небольшого набора данных.
  2. С XML вы все время перемешиваете строки. Это может быть просто терпимо при чтении, но это настоящий кошмар при записи (медленный анализ, большой объем памяти и т. Д.). Хотя вы можете использовать XML для работы в качестве хранилища данных, это просто неправильный инструмент для работы.
  3. Нет (все будет длиться вечно, если до этого у вас не хватит памяти).
  4. Нет, по многим причинам (блокировка, перезапись всей XML-строки / файла, не говоря уже о памяти).

5a. SQLite был разработан с учетом очень маленьких и простых баз данных - простых, без серверных зависимостей (БД содержится в одном файле). Как @Robert Gould указывает в комментарии , он не масштабируется для более крупных приложений, но затем

5b. для хранилища данных среднего и большого размера рассмотрим реляционную базу данных (и обычно проще переключать базы данных, чем переключаться с XML на базу данных).

4 голосов
/ 04 апреля 2009

Нет, оно не будет масштабироваться. Это неосуществимо.

Вам лучше использовать, например, SQLite . Вам не нужен сервер, он по умолчанию связан с PHP и хранит данные в обычных файлах.

3 голосов
/ 04 апреля 2009

Я бы выбрал SQLite , который идеально подходит для небольших веб-сайтов и развертываний в стиле ксерокопирования.

Хранилище данных на основе XML будет плохо масштабироваться.

" SQLite - это ACID-совместимая встроенная система управления реляционными базами данных, содержащаяся в относительно небольшой (~ 225 кБ) библиотеке программирования C. Исходный код для SQLite находится в открытом доступе. 1010 *

В отличие от систем управления базами данных клиент-сервер, механизм SQLite не является автономным процессом, с которым программа взаимодействует. Вместо этого библиотека SQLite связана и, таким образом, становится неотъемлемой частью программы. Это также может быть вызвано динамически. Программа использует функциональность SQLite с помощью простых вызовов функций, что уменьшает задержку при доступе к базе данных, поскольку вызовы функций в рамках одного процесса более эффективны, чем межпроцессное взаимодействие. Вся база данных (определения, таблицы, индексы и сами данные) хранится в виде одного кроссплатформенного файла на хост-компьютере. Эта простая схема достигается путем блокировки всего файла базы данных в начале транзакции. "

2 голосов
/ 04 апреля 2009

Каждый любит поливать грязью файлы XML, но на самом деле это работает, я видел, как их используют большие приложения, и я знаю о MMO, которая использует простые плоские файлы для хранения, и она прекрасно работает (кстати, MMO в топ-5 во всем мире, так что это не просто игрушка). Тем не менее, моя работа сейчас заключается в создании лучшего и более безопасного слоя персистентности на основе SQL, и, если ваш сайт будет большим, SQL является лучшим решением, но XML способен масштабировать (MMO) масштабируемость, если все сделано хорошо.

Но предостережение о том, что переход с XML на SQL является грубым, если сопоставление нелегко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...