Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: приём, разбор и сравнение xml файлов на сайте

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: принять разобрать, сравнить и при необходимости обновить бд
broshurkaplus
Отправлено: 21 Декабря, 2016 - 10:59:24
Post Id



Посетитель


Покинул форум
Сообщений всего: 354
Дата рег-ции: Янв. 2011  
Откуда: Пружаны Бресткая обл. Беларусь


Помог: 2 раз(а)




здравствуйте
возникла задача для ресурса, пользователи просят сделать такую функцию - выгрузка товаров из xml

планируется алгоритм:
пользователь загружает файл
модератор проверяет
пользователь жмет внести - данные заносятся в бд
повторно загружает файл - тоже, толдько сравнить файлы (переведём в пхп массивы) (планируется сравнивать хеш от данных в элементе) и внести изменения (удалить, обновить, добавить)

подскажите пожалуйста варианты (правильный) алгоритм работы?
как лучше сравнивать файлы?
как это организовать автоматически с минимумом затрат?
 
 Top
Мелкий Супермодератор
Отправлено: 21 Декабря, 2016 - 11:47:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Нафиг вообще загружать файл повторно?

Правильный алгоритм зависит от вашей бизнес-логики. В частности, модерация в целом - это только требование бизнеса. Требование реализации - валидация, что XML имеет какую-то осмысленную структуру и вы эту структуру можете помержить с базой. Всё, если валидно - значит можно писать, нет - ответ пользователю с пояснением, что в документе сделано неверно.

Для регулярных обязательны ещё хотя бы одно из двух сценариев:
слушающий скрипт, которому можно присылать новый xml (ака push политика обновления)
фоновый скрипт, загружающий по указанному пользователем урлу новый xml с какой-то регулярность (pull соответственно)


-----
PostgreSQL DBA
 
 Top
broshurkaplus
Отправлено: 21 Декабря, 2016 - 12:36:20
Post Id



Посетитель


Покинул форум
Сообщений всего: 354
Дата рег-ции: Янв. 2011  
Откуда: Пружаны Бресткая обл. Беларусь


Помог: 2 раз(а)




ммда

на данном этапе только ручно планирую, (бесплатно например раз в неделю 1 файл на 1000 элементов, для каждой конечной категории или 3 файла) пользователь загрузит файл, он валидируется
вот тук как мне
сразу писать - нагрузка на бд в основной таблице, поэтому думаю что
первый раз - может как-то сложить в таблицу в очередь все запросы на добавление, а потом уже вставлять в основную таблицу по частям кроном например
при повторной загрузке сравнивать и в очередь только новые, удалённые или измененные
вопрос как сравнивать?
читать лучше в цикле simplexml_load_file целиком или лучше XMLReader по частям очищая память на каждой итерации?

если не сложно напишите чуть подробней алгоритм который видится Вам
спасибо
 
 Top
Мелкий Супермодератор
Отправлено: 21 Декабря, 2016 - 13:51:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Алгоритм мне не видится пока не понятны требования.

Просто помержить несколько десятков тысяч строк - фигня какая. Лишь бы только всякое orm не мешалось.
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TEMPORARY TABLE tmptable
  2. -- слить данные из файлика в эту временную табличку
  3. CREATE UNIQUE INDEX ON tmptable USING(ext_id)
  4. begin
  5. UPDATE realtable JOIN tmptable USING(ext_id) ...
  6. DELETE FROM realtable WHERE NOT EXISTS (SELECT 1 FROM tmptable WHERE realtable.ext_id = tmptable.ext_id)
  7. INSERT INTO realtable (...) SELECT ... FROM tmptable WHERE NOT EXISTS (SELECT 1 FROM realtable WHERE realtable.ext_id = tmptable.ext_id)
  8. commit
  9. DROP TEMPORARY TABLE tmptable


Для нужд модерации можно использовать не временную, а постоянную табличку. Добавить ещё file_id со ссылкой на табличку загружаемых файликов. Партицировать этак по месяцам, чтобы было попроще ненужные более разделы удалять.
Модератору станет удобнее показывать данные уже из персистентной таблички.

Какие-нибудь категории позволять передавать в формате источника - мелкие списки вычитайте в словарь, внешний_id => свой.
Большие списки - писать во временную табличку данные как есть. И рядом поле default null для ваших id. Затем апдейтом помержить со словарём и пройтись по локальный_id is null чтобы узнать, не надо ли пользователю сказать "у вас значения поля непонятное" и прерваться. Или не мержить такие, смотря что вам говорит задача. Мне нужна была строгая валидация.

Чем читать файлик - какая разница. Скройте эту информацию за фасадом из, например, yield. Не будет устраивать - замените.


-----
PostgreSQL DBA
 
 Top
broshurkaplus
Отправлено: 12 Января, 2017 - 13:15:06
Post Id



Посетитель


Покинул форум
Сообщений всего: 354
Дата рег-ции: Янв. 2011  
Откуда: Пружаны Бресткая обл. Беларусь


Помог: 2 раз(а)




сорри за много букв, но не делал такое, поэтому сложно самому выдумать алгоритм
праздники прошли, реализовал часть функционала под требования:
пользователь -
при добавлении xml-файла пользователь сразу жёстко выбирает раздел и категорию + город (привязанный к аккаунту)
заливает файл, он на ходу проверяется на длинну (в 1000 элементов), xsd схему, сразу показываем ошибки если они есть
модератор -
может просмотреть данные и одобряет/отклоняет файл целиком, если одобряет - вычитываем данные в постоянную таблицу очереди, привязав к пользователю и xml-файлу
пользователь далее -
видит одобренные файлы, оплачивает(или бесплатно) файл ставится в очередь на исполнение, кроном мержится по частям с основной таблицей

???
далее есть вопросы
если можно направьте как лучше сделать:
при обработке нового файла - кроном по частям выбираем связанные записи и звносим в основную таблицу - файлу ставим статус "обработан"
? - что можно использовать на обычном хостинге для обработки очереди (чтоб за раз файл вычитывать и мержить с основной таблицей, тк нагрузка есть- кроме вставки выполняется жменя запросов на агрегацию данных)
? после соединения может удалять данные из таблицы очереди

далее, например через неделю у пользователя изменились цены например и часть данных, и он обновляет файл
как вот тут поступить, если можно поподробнее
? может в xml-файл хеш данных совать чтоб их потом сравнивать.
? сравнивать данные нового файла с данными табл. очередей и новые данные вставить, а для изменившихся - метку для обновления в основной таблице или обновлять все подряд
? как не затратно отсеять те что надо удалить

? и как лучше обрабатывать фото

спасибо что прочли
жду ваших мнений

(Отредактировано автором: 12 Января, 2017 - 14:06:37)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« XML и его обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB