Долгий процесс php зависает на подаче. Плохой дизайн проекта?

Привет, мне нужны предложения для моего исследовательского проекта.

Я создаю базу данных, которая читает RSS-каналы, созданные оповещениями Google, и сохраняет результаты в базе данных для последней классификации. Я использую платформу Wordpress и pods для обработки базы данных и пользовательского интерфейса.

У меня есть 4 объекта (модуля) со своими таблицами:

  • Ресурсы, это данные сайта, взятые из ленты оповещений.
  • Источники, это домен сайта, например stackoverflow.com
  • Каналы с запросом оповещения и URL-адресом RSS.
  • Темы, основные темы, по которым классифицируются другие объекты.

Поток программы вкратце таков:

  • По каждой теме берите фиды.
  • Для каждого канала загрузите RSS XML.
  • Для каждого URL-адреса записи в rss, если он новее последней проверки, проверьте, сохранен ли уже домен в объекте «Источники».
  • Если источник присутствует, проверьте, сохранен ли URL-адрес в объекте ресурса.
  • Если ресурс присутствует (то есть у нас уже есть данные для этого URL-адреса), добавьте текущую тему и канал цикла к ресурсу (если он отсутствует).
  • Если ресурс отсутствует, сохраните ресурс с некоторыми данными, текущей темой и лентой.
  • Если источник отсутствует, сохраните источник с текущей темой.

Таким образом, у меня будет куча ресурсов со связанными фидами и темами, а также относительные источники с их темами.

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

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

Поэтому мне нужен способ сделать его более эффективным или избежать проблемы разделения процесса.

Поскольку скрипт вызывается через Ajax, я подумал, что этот поток будет работать:

  • Запросите у сервера структуру тем/каналов.
  • Для каждого канала в каждой теме попросите сервер загрузить XML и передать его обратно в виде массива.
  • Затем в интерфейсе для каждой записи отправьте вызов сравнения и сохранения.

Конечно, недостаток в том, что мне будет много звонков.

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

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

Изменить: код здесь https://github.com/bakaburg1/overseer


person Bakaburg    schedule 30.06.2013    source источник


Ответы (1)


Я думаю, вы загружаете слишком много данных одновременно. Весь смысл AJAX заключается в том, чтобы загружать данные понемногу, по мере необходимости. На самом деле не имеет значения, что у вас много HTTP-вызовов к серверу, пока сценарии, которые вы запускаете для возврата данных, не зависают, как у вас.

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

person dsw88    schedule 30.06.2013
comment
Итак, вы предлагаете решение для многих звонков, даже если это займет больше времени? - person Bakaburg; 30.06.2013
comment
Ну, это займет больше времени, если вы сделаете их все сразу. Но рассредоточьте их, вызывая данные только тогда, когда их запрашивает пользователь, и накладные расходы HTTP не являются такой проблемой. Но да, если речь идет о получении всех данных сразу с помощью одного HTTP-вызова, а не о получении всех данных сразу с помощью нескольких HTTP-вызовов, вы определенно просто понесете больше накладных расходов. Но если бы вы могли спроектировать его так, чтобы вам не нужно было получать все данные сразу, это определенно ускорило бы работу пользователя. - person dsw88; 01.07.2013
comment
К счастью, единственными пользователями будут и моя команда. Hwr по идее как раз первые звонки понадобятся давно так как будет много новых записей для анализа. Hwr Я попробую с несколькими способами Ajax. Любая идея о решении flush() вместо этого? Стоит попробовать? Ps: в вопрос добавлен URL-адрес представителя github. - person Bakaburg; 01.07.2013