Как сделать свой магазин?

Обсуждение сервиса товарной рекламы Микс-Товары
Exty
Сообщения: 5
Зарегистрирован: 03 ноя 2005, 20:38
Откуда: Bratsk
Контактная информация:

Сообщение Exty » 27 фев 2006, 11:56

woofer писал(а):Есть ли уже готовый рабочий скрипт на пхп для конвертации xml-каталога в mysql?
Буду очень благодарен, если кто-то поделится! Хочу разобраться, как же все-таки разбирать xml и переводить его в mysql-базу! :)

Если разобраться, то сюда:
http://php.rinet.ru/manual/en/ref.xml.php

Если нужен готовый скрипт на обработку, то на мыло - exty[собака]yandex[точка]ru, хотя этого добра в сети навалом... имхо.

Ashman
Сообщения: 1
Зарегистрирован: 01 мар 2006, 15:52
Откуда: Нариманов
Контактная информация:

Пустые прайсы

Сообщение Ashman » 01 мар 2006, 16:22

Здравствуйте служба поддержки МиксМаркет. Сегодня вы подтвердили возможность создания моего магазина, и когда я вошёл в аккунт увидел ссылки на три прайса xml и все они пустые, скажите как же я создам сайт если я не вижу в xml абсолютно не чего. Я так же прочитал что база обновляется два раза в день, скажите именно по этому мой прайс пустует? или я предположил что прайс заполнится товарами тех магазинов которые выбрали мою площадку для рекламы, но тогда у меня сразу возник вопрос как же я покажу сайт рекламодателям если нет xml из которого его лепить. То есть меня интересует в чём же всё же причина пустых прайсов в том что в течении суток 2 раза обновляется каталог или в том что нет не одного рекламодателя который разместил в моём прайсе свои товары? Жду ответа, это важно. И ещё пожалуйста если не трудно пришлите мне java script вашего меню со странички http://www.mixmarket.biz/catalogue_part/all/ я хочу такое же разместить на своём сайте. Жду ответа.
Студент ААДК.

polgete
Сообщения: 52
Зарегистрирован: 10 май 2006, 17:31

Сообщение polgete » 12 май 2006, 02:08

Тоже интересно, может быть и местным программистам замутить нечто, как партнерский магазин от porta.ru этими магазинами уже весь нет загадили, но отдача-то есть

Astrolog
Сообщения: 228
Зарегистрирован: 14 дек 2007, 10:06
Откуда: Россия
Контактная информация:

Сообщение Astrolog » 08 мар 2009, 22:51

Александр Сабаев писал(а):$doc=domxml_open_file("http://mixmarket.biz/mixmldirect.plx?id=4294967238");

Эта функция аналогична $file_array=file($file_name);
только для слива информации с другого сайта? Так?
По идее не вижу ничего сложно в операции над скачанным файлом с Вашего сайта, но вот как его скачать и сохранить скажем у себя? Это как раз и делает код, приведенный выше, так ведь? (если скажем не текст выводить, а также построчно данные в файл писать)

Аватара пользователя
ivanov
Эксперт
Эксперт
Сообщения: 2192
Зарегистрирован: 20 фев 2006, 19:02
Откуда: Санкт-Петербург
Контактная информация:

Сообщение ivanov » 08 мар 2009, 23:53

Astrolog писал(а):Эта функция аналогична $file_array=file($file_name);
только для слива информации с другого сайта? Так?

Нет, оно хватает файл и преобразует его в специальный объект класса Domdocument.
Короче, подготавливает его к тому, чтобы оттуда можно было доставать данные (и складывать, например, в базу данных).
См. http://ru2.php.net/manual/ru/function.d ... n-file.php

А забрать файл к себе можно так:

Код: Выделить всё

<?php 
$xml = file_get_contents('http://mixmarket.biz/mixml.plx?id=4X9X9X5X0X');
$local = fopen('mixml.xml','w');
fwrite($local, $xml);
fclose($local);
?>
Денис Иванов, экс-Миксмаркет
upyrj@ya.ru

bloodrave
Сообщения: 4
Зарегистрирован: 20 ноя 2009, 15:24

Сообщение bloodrave » 20 ноя 2009, 17:20

полностью поддерживаю запрос

Serj22
Сообщения: 2
Зарегистрирован: 07 ноя 2009, 17:46

Сообщение Serj22 » 27 ноя 2009, 20:30

Помогите отправить данные после парсера в MYSQL
Например данные на выходе парсера заносятся в переменную $tmp

Код: Выделить всё

$tmp = $xml->GetTag($arr,"currency");



Таблицы в MYSQL я тоже сделал руками.

Далее я соединяюсь с базой но как поступить дальше

Например при использовании mysql_query("UPDATE... - товар заменяется. Но что если заказчик сменит ID

Я так понимаю что нужно использовать связку DELETE INSERT внутри функции foreach или использовать if else

Помогите пожалуйста кусочком кода на PHP для обновления любой таблицы в MYSQL.













[/code]

Tarkoff
Сообщения: 4
Зарегистрирован: 14 июл 2009, 18:31

Сообщение Tarkoff » 27 ноя 2009, 23:59

Например при использовании mysql_query("UPDATE... - товар заменяется. Но что если заказчик сменит ID

Я так понимаю что нужно использовать связку DELETE INSERT внутри функции foreach или использовать if else

Помогите пожалуйста кусочком кода на PHP для обновления любой таблицы в MYSQL.

Мне кажется, чтобы предупредить такие и любые другие изменения в предложениях таблицу с товарами лучше перед парсингом очищать (через TRUNCATE) и заполнять заново.
1) Такой подход намного сократить количество запросов к БД (так как нужно выполнить всего один sql запрос, а не удалять каждую запись отдельным DELETE).
2) Использовать множественную вставку за один запрос, что также сохранит время и ресурсы сервера (тоесть запрос типа "INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);").
Но тут нужно учесть что максимальный размер самого текста sql запроса не должен превышать 1 Mb (насколько я помню).
В php все єто можно реализовать примерно так:

Код: Выделить всё

$insertParts = array();
//MIXMARKET_OFFERS - имя таблицы с предложениями
$sql = 'INSERT INTO MIXMARKET_OFFERS (....) VALUES ';

mysql_query("TRUNCATE TABLE MIXMARKET_OFFERS;");
foreach ($offers as $offer) {
  $insertParts[] = "({$offer['id']}, {$offer['brandid']}, {$offer['advid']}....)"; //Формируем одну запись для добавления
  // За один запрос добавляем 50 предложений
  if (count($insertParts) % 50 == 0) {
    mysql_query($sql . implode(',', $insertParts));
    $insertParts = array();
  }
}

//На случай если общее число предложений не делится нацело на 50
if (count($insertParts)) {
  mysql_query($sql . implode(',', $insertParts));
}

P.S. Можно еще использовать тип таблиц innoDb, что позволит использовать транзакции (http://dev.mysql.com/doc/refman/5.0/en/commit.html), что также сэкономит ресурсы. Для этого нужно перед циклом вставить

Код: Выделить всё

mysql_query("START TRANSACTION;");  //Начинаем транзакцию

а после цикла

Код: Выделить всё

mysql_query("COMMIT;"); //Выполняем за один сеанс все запросы

Аватара пользователя
ivanov
Эксперт
Эксперт
Сообщения: 2192
Зарегистрирован: 20 фев 2006, 19:02
Откуда: Санкт-Петербург
Контактная информация:

Сообщение ivanov » 28 ноя 2009, 00:13

Если не ошибаюсь, то offerid вообще вечный для каждого товара.
То есть можно облегчить запросы, помечая только активность товара и обновляя его цену.

Но лучше уточнить эти моменты у саппорта или у программеров — в понедельник уже.
Денис Иванов, экс-Миксмаркет
upyrj@ya.ru

Tarkoff
Сообщения: 4
Зарегистрирован: 14 июл 2009, 18:31

Сообщение Tarkoff » 28 ноя 2009, 01:10

ivanov писал(а):Если не ошибаюсь, то offerid вообще вечный для каждого товара.
То есть можно облегчить запросы, помечая только активность товара и обновляя его цену.

Но лучше уточнить эти моменты у саппорта или у программеров — в понедельник уже.

Делать каждый день апдейт по offerid не есть облегчение).
Пример:
Я получаю прайс с 10тис. предложений, все они добавляются в базу.
На второй день снова 10тис. из них пусть 2 тис. новых добавляются в базу (мне нужно вставить 2000 предложений + выполнить 10тис. UPDATE запросов для обновления цены и состояния вчерашних предложений)
На третий день еще 2000 новых предложений, но теперь уже нужно сделать 12тис. UPDATE запросов для обновления цены и состояния старых предложений....
В результате каждый день количество выполняемых UPDATE запросов возрастает в арифметической прогрессии + нужно сделать запросы на вставку новых...
А если очищать таблицу предложений и заносить туда каждый раз только актуальные предложения, то количество запросов каждый день будет ~ 10000 / 50 = 200 запросов.
+ можно увеличить количество вставляемых за раз предложений до 100, то разница между больше чем 10000 запросов и 100 запросов для сервера еще ощутимей)

Аватара пользователя
ivanov
Эксперт
Эксперт
Сообщения: 2192
Зарегистрирован: 20 фев 2006, 19:02
Откуда: Санкт-Петербург
Контактная информация:

Сообщение ivanov » 28 ноя 2009, 05:25

Эмм... Можно ведь таблицу цен грохать каждый раз, храня ее отдельно.
Я просто хотел намекнуть, что часть данных можно вообще не обрабатывать на уже занесенных в базу товарах.
Ну или не каждый раз обновлять.

Впрочем не стану спорить — я не спец вовсе.
Денис Иванов, экс-Миксмаркет
upyrj@ya.ru

Tarkoff
Сообщения: 4
Зарегистрирован: 14 июл 2009, 18:31

Сообщение Tarkoff » 28 ноя 2009, 12:51

С этим я согласен что часть данных получаемых в xml можно не обновлять каждый день.
Например, хранить в отдельных таблицах: бренды, магазины, категории, регионы доставки, геотаргетинг и обновлять эти таблицы только при необходимости.
Но как я понимаю держать предложения в актуальном состоянии с минимальными затратами ресурсов и времени можно только перезаписью предложений заново.
Если Ваши специалисты подскажут оптимальный вариант импорта и обновления предложений многие будут им благодарны)

Аватара пользователя
ivanov
Эксперт
Эксперт
Сообщения: 2192
Зарегистрирован: 20 фев 2006, 19:02
Откуда: Санкт-Петербург
Контактная информация:

Сообщение ivanov » 28 ноя 2009, 23:02

Ок, я попрошу программеров прокомментировать на неделе.
Денис Иванов, экс-Миксмаркет
upyrj@ya.ru

Tduty1972
Сообщения: 11
Зарегистрирован: 24 янв 2009, 14:21

Сообщение Tduty1972 » 29 ноя 2009, 18:10

Можно реализовывать таким образом, менее затратно.
1) Если считать, что данные вставлены, нужно лишь обновить (погасить, включить товарные позиции). Мы делаем вставку лишь АйДишников во врменную таблицу. ИСпользую запросы типа:
UPDATE offers SET enable=0 WHERE ofId IN
SELECT offersCopyTable.ofId
FROM offersCopyTable
LEFT JOIN offersXMLtable
USING(ofId)
WHERE offersXMLtable.ofID IS NULL


===============
Поясню: offersCopyTable - таблица с товарными предложениями копия текущей. Именно копия, так как Обновление с таблице со вложенным запросом на выборку в ней же - недопустим. Копировать таблицу можно очень просто INSERT - SELECT
offersXMLtable - таблица с текущими разобранными товарными предложениями из нового прайс-листа XML. Именно в ней присутствуют те товары, которые отдал миксмаркет.

Таким образом, предыдущий запрос может выделить и обновить записи из таблицы offers (рабочая, по которой магазин выполняет выборки).

Чтобы включить ранее погашенные товарные предложения, надо изменить текущий запрос с точностью наоборот:
UPDATE offers SET enable=1 WHERE ofId IN
SELECT offersCopyTable.ofId
FROM offersCopyTable
LEFT JOIN offersXMLtable
USING(ofId)
WHERE offersXMLtable.ofID NOT IS NULL

==================

А вот с добавлением новых товаров - это уж сами сделаете. Там ничего необычного нет.

Tduty1972
Сообщения: 11
Зарегистрирован: 24 янв 2009, 14:21

Сообщение Tduty1972 » 29 ноя 2009, 18:16

Да, вот еще что. Желательно протестировать данные запросы на конкретной машине. Необходимо обязательно использование индексов, иначе такие апросы будут сильно нагружать машину.
В циклах PHP рекомендую использовать usleep(n), где n - это пауза в МИКРОсекундах. Это позволит дать другим ресурсам делать свое дело и не вешать сильно машину. Результат - немного дольше обрабатывается прайс, но зато гораздо меньшей ценой.

Стандартные средства XML парсеров - не очень выгодны для разбора больших прайс-листов. Несколько мегабайт XML прайса - могут заполнить всю память.
Рекомендую использовать чтение прайслиста небольшими порциями и обращать внимание на те участки, которые интересны вашему парсеру. Как только очередная порция данных прошла обработку - берем следующую часть прайса и прицепляем к оставшейся части от пердыдущего. И так далее.

Ответить