Динамически добавлять новые таблицы и строки, запрашивающие источник XML с Javascript и PHP - PullRequest
5 голосов
/ 15 мая 2011

Я программирую веб-сервис, который запрашивает цены в разных базах данных. Веб-служба записывает новый узел <Result> на страницу XML, которая возвращается при вызове http://service.com/xml.php?search=carpet, как только он получает результаты из базы данных. К сожалению, запросы, отправляемые в различные базы данных, занимают очень много времени (всего до 30 секунд). Очевидно, я не хочу, чтобы пользователь ждал 30 секунд, затем возвращал XML и создавал таблицу с этими данными; Я хочу, чтобы он динамически загружался.

Предположим, что пользователь ищет "Ковер" , базы данных будут возвращать несколько продуктов, таких как "Красный Ковер" и "Желтый Ковер" . «Красный ковер» имеет двух распространителей, которые динамически загружаются в таблицу «Красный ковер» . «Желтый ковер» имеет только одного дистрибьютора.

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

У вас есть предложения, как этого добиться? Как получить только те данные, которые изменились из моего xml.php?

Структура сравнительной таблицы цен

price comparison table structure

Данные XML

<?xml version="1.0" encoding="UTF-8"?>
<Results>
<!--Given back within 5 seconds-->
<Result>
    <ArticleNumber>Red Carpet</ArticleNumber>
    <Manufacturer>Big Carpet Inc</Manufacturer>
    <Distributor>Amazonas</Distributor>
    <Prices>
        <Pricebreak>
            <Quantity>1</Quantity>
            <Price>$ 1.20</Price>
        </Pricebreak>
        <Pricebreak>
            <Quantity>10</Quantity>
            <Price>$ 1.00</Price>
        </Pricebreak>
        <Pricebreak>
            <Quantity>100</Quantity>
            <Price>$ 0.50</Price>
        </Pricebreak>
    </Prices>
</Result>
<!--Given back within another 10 seconds-->
<Result>
    <ArticleNumber>Red Carpet</ArticleNumber>
    <Manufacturer>Big Carpet Inc</Manufacturer>
    <Distributor>Veritas</Distributor>
    <Prices>
        <Pricebreak>
            <Quantity>1</Quantity>
            <Price>$ 0.90</Price>
        </Pricebreak>
        <Pricebreak>
            <Quantity>5</Quantity>
            <Price>$ 0.70</Price>
        </Pricebreak>
    </Prices>
</Result>
<!--Given back within another 5 seconds-->
<Result>
    <ArticleNumber>Yellow Carpet</ArticleNumber>
    <Manufacturer>Smallrug Corporation</Manufacturer>
    <Distributor>Veritas</Distributor>
    <Prices>
        <Pricebreak>
            <Quantity>1</Quantity>
            <Price>$ 3.90</Price>
        </Pricebreak>
        <Pricebreak>
            <Quantity>10</Quantity>
            <Price>$ 2.70</Price>
        </Pricebreak>
    </Prices>
</Result>
</Results>

Ответы [ 6 ]

5 голосов
/ 15 июня 2011

... на самом деле запросы не источник данных sql, но для драйверов, которые получить информацию из HTML сайты ...

Если это так, то я предлагаю вам не делать этого, когда вызывается ваша веб-страница. Но лучше иметь какой-нибудь другой скрипт, выполняющийся как задача или служба cron, которая периодически опрашивает эти данные в зависимости от того, насколько изменчивы данные. Раз в 5 минут или каждый час, каждый день? И пусть это заполнит вашу локальную базу данных, которую вы сможете опрашивать с гораздо большей скоростью. Это позволит вам загрузить любые данные, которые вы пожелаете, поскольку пользователь выбирает их, не дожидаясь парсера.

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

Кроме того, вы можете выполнить обновление вручную, если знаете, что данные были обновлены, если автоматический процесс недоступен.

2 голосов
/ 09 июня 2011

Предположим, что вы не можете изменить какую-либо структуру и обновить производительность извлечения данных, я думаю, что единственным решением является кэширование результата и попытка создать копию БД в локальной БД.

Асинхронный режим, я думаю, вы находитесь на лучшем пути.

Вы можете разработать сценарий, который копирует медленные запросы, в локальную базу данных, к которому быстрее всего будет обращаться из приложения переднего плана, и применить этот сценарийв Cron Job, также, если вы можете обрабатывать обновленные записи, вы находитесь на гребне волны;)

Я думаю, что это может помочь

0 голосов
/ 19 июня 2011

Я предпочитаю кэшировать удаленные цены и делать расчеты по кэшированным переменным, и если они истекли, вы можете получить их из веб-службы.Вы можете сделать это с помощью APC, memcached, xCache и т. Д.

Или вы можете рассчитать их за периоды с заданиями cron (например, с интервалом 5 минут или более) и записать их в локальную базу данных.

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

0 голосов
/ 18 июня 2011

Я могу придумать как минимум 2 способа получить то, что тебе нужно.

Метод № 1 Серверная сторона разбивает выходные данные вашего веб-сервиса на два запроса и возвращает наборы. Первоначальный запрос должен содержать список идентификаторов результатов и второй запрос, который можно назвать одним набором результатов по имени идентификатора.

service.com / results.xml.php? возвращает: 1 2 и т.д ...

service.com / result.xml.php? Id = возвращает: так далее...

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

Что вы можете сделать, так это спамить первый запрос и сравнить его с идентификатором, отображаемым в данный момент, а затем запросить №2 для получения дополнительной информации, которую вам необходимо отправить.

Метод № 2:

Пусть 1 запрос вернет все результаты, как вы делаете сейчас, но используйте поле идентификатора, хранящееся локально в вашей части сценариев, которое отслеживает, какой контент уже отображен, и только добавляет новые данные через AJAX на существующую страницу. В этом случае вам понадобится, чтобы ваш javascript извлекал и анализировал XML в циклической среде.


Истинная загвоздка в том, как ваше приложение определяет, что оно имеет все результаты, и прекращает цикл?

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

пример:

выберите элемент сравнения из исходного кода, где параметр сравнения =

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

выберите * из исходного кода, где сравнивать =

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

ajax псевдокод для метода # 1: - установить текущие отображаемые результаты на 0 - установить массив отображаемых идентификаторов в нуль - запустите базовый запрос, чтобы определить, сколько строк вы ожидаете всего (подсчитайте каждого поставщика отдельно, если у вас есть несколько источников, затем сложите их все) - войти в цикл - получить XML с деталями - обработать xml id по id, чтобы увидеть, отображается ли он еще (если массив равен нулю, первая итерация отобразит их все) - любой идентификатор, который необходимо отобразить, добавьте идентификатор в качестве члена массива отображаемого идентификатора. - накачать детали в документ - увеличивать текущие отображаемые результаты на 1 для каждой отображаемой детали идентификатора результата - проверьте, показали ли вы все ожидаемые результаты. (displayids> = ожидаемые результаты). если правда выходной цикл. если нет, продолжайте.

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

0 голосов
/ 16 июня 2011

Если вы действительно хотите получать только измененные данные, вам нужно сделать 4 вещи

  1. Версия xml
  2. Периодически запрашивать у вашего JS номер версии
  3. если другой JS, то вызывает "updateFromCurrentVersion (currentVersion)"
  4. updateFromCurrentVersion возвращает изменения
0 голосов
/ 16 июня 2011
  1. Производительность / Кэширование : повышение скорости ваших "запросов" которые получают ваши данные ИЛИ реализовать агрессивная стратегия кеширования. я если вы пишете веб-приложение с технологическим стеком, который поддерживает кеширование. Memcached хорошее кэширование общего назначения библиотека, которая работает с большим количеством веб приложение стеки. Если вам приходится полагаться на сбор данных с веб-сайтов конкурентов, то может помочь задание cron или очередь задач, которые могут справиться с этим через регулярные промежутки времени.

  2. Автоматическое обновление : по сути, вы говорите о непрерывном опросе ajax, при котором вы будете иметь постоянное соединение, открытое от клиента к серверу, и отвечать на новые данные, вставляя html в ваш стр. Взгляните на socket.io , он предоставляет абстракцию, которая позволяет осуществлять непрерывный опрос с помощью ряда транспортных методов (длинный опрос xhr, flash, веб-сокеты и т. Д.) И поддерживает все последние браузеры ( включая IE 5.5 и выше).

  3. Рендеринг : взгляните на функцию template , которая является частью underscore.js , это достойный способ создания многоразовой разметки шаблон (то есть: структура строк вашей таблицы) и передайте ему JSON для визуализации в строку разметки. Затем вы можете использовать библиотеку, такую ​​как jQuery или Prototype, чтобы добавить разметку.

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