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
Форумы портала PHP.SU :: Версия для печати :: приём, разбор и сравнение xml файлов на сайте
Форумы портала PHP.SU » » XML и его обработка » приём, разбор и сравнение xml файлов на сайте

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

1. broshurkaplus - 21 Декабря, 2016 - 10:59:24 - перейти к сообщению
здравствуйте
возникла задача для ресурса, пользователи просят сделать такую функцию - выгрузка товаров из xml

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

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

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

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

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

если не сложно напишите чуть подробней алгоритм который видится Вам
спасибо
4. Мелкий - 21 Декабря, 2016 - 13:51:28 - перейти к сообщению
Алгоритм мне не видится пока не понятны требования.

Просто помержить несколько десятков тысяч строк - фигня какая. Лишь бы только всякое 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. Не будет устраивать - замените.
5. broshurkaplus - 12 Января, 2017 - 13:15:06 - перейти к сообщению
сорри за много букв, но не делал такое, поэтому сложно самому выдумать алгоритм
праздники прошли, реализовал часть функционала под требования:
пользователь -
при добавлении xml-файла пользователь сразу жёстко выбирает раздел и категорию + город (привязанный к аккаунту)
заливает файл, он на ходу проверяется на длинну (в 1000 элементов), xsd схему, сразу показываем ошибки если они есть
модератор -
может просмотреть данные и одобряет/отклоняет файл целиком, если одобряет - вычитываем данные в постоянную таблицу очереди, привязав к пользователю и xml-файлу
пользователь далее -
видит одобренные файлы, оплачивает(или бесплатно) файл ставится в очередь на исполнение, кроном мержится по частям с основной таблицей

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

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

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

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

 

Powered by ExBB FM 1.0 RC1