PHP - Cron Jobs, которые синхронизируют данные из внешнего API.Как моя методология? - PullRequest
0 голосов
/ 08 мая 2011

Я получил несколько отзывов о веб-приложении на основе PHP / MySQL, которое находится в процессе разработки. Приложение представляет собой сайт для членов, который использует локальную базу данных для хранения данных для каждого пользователя по дням. Эти данные поступают из внешнего API и должны ежедневно автоматически синхронизироваться, чтобы моя локальная БД содержала последние данные. Это методология, которую я имею в виду:

У меня есть 2 задания Cron:

  1. Построитель очереди

  2. Работник очереди

.. и 3 таблицы базы данных:

  1. Данные пользователя (хранит все имеющиеся у меня пользовательские данные, если таковые имеются).

  2. Данные пользователя (список всех участников, включая пользователей, для которых у меня пока нет данных, или новые регистрации).

  3. Очередь обработки

Построитель очередей - это PHP-скрипт, который будет запускаться через Cron через регулярные промежутки времени. Это будет:

  • Сравните таблицы Сведения о пользователе и Данные пользователя , чтобы определить, для каких новых пользователей у меня еще нет данных. Для этих пользователей он создаст список URL-адресов, начиная с 01.01.11 и по сегодняшний день, и вставит их в таблицу Очередь обработки (это потому, что я хочу получить данные с начала год для всех моих пользователей).

  • Анализ таблицы User Data , чтобы определить, когда данные каждого пользователя были синхронизированы в последний раз, и создание списка URL-адресов с последней синхронизированной даты до текущего дня. Они также будут вставлены в таблицу Очередь обработки .

Таким образом, Таблица Очереди обработки будет содержать список всех URL-адресов, которые необходимо запросить.

Работник очереди также является сценарием PHP Cron, который будет:

  • Выберите первые 20 элементов в таблице Очередь обработки , получите их содержимое с помощью CURL multi, error-check, а затем удалите первые 20 строк из таблицы. Я разбиваю его на 20 URL за раз, потому что, если я обрабатываю слишком много URL, скрипт может зависнуть или мой хост может постучаться в мою дверь, оснащенный дробовиком.

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

  1. Каковы общие мысли о моей методологии? Есть ли побочные эффекты от этого? Я разработчик-хобби, не имеющий опыта работы с CS, поэтому всегда стремлюсь к критике и изучению лучших практик! =)

  2. Когда новый пользователь зарегистрируется, я планирую дать им «ваши данные могут занять xx минут для синхронизации», перенаправляя их на ресурсы «Приступая к работе» и т. Д. Это, вероятно, хорошо для моего первоначального выпуска, но дальше трек, который я хотел бы уточнить, чтобы пользователи получали уведомление по электронной почте, когда синхронизация готова или может видеть% прогресса. Легко ли в моем нынешнем решении это подходит? Или у меня будут головные боли вниз по дорожке?

Мнения приветствуются! Большое, ОГРОМНОЕ спасибо заранее - надеюсь, я это четко объяснил!

1 Ответ

0 голосов
/ 08 мая 2011

Наверное, лучший совет, который я могу вам дать, это: ПОЦЕЛУЙ !!Нет, я не излишне ласков, это означает "будь проще, глупый!"и, возможно, очень важный инженерный принцип.Имея это в виду, первый вопрос, который я задам, - "почему cron?"Возможно ли, чтобы все эти задачи выполнялись в режиме реального времени, когда пользователи регистрируются?Если да, я бы сказал, что пойти с этим на данный момент и не беспокоиться о cron.Если вы решите использовать модуль cron, я бы порекомендовал следующее:

  • Попробуйте использовать файл блокировки, чтобы предотвратить одновременное выполнение нескольких экземпляров вашего скрипта.Например, если вы запускаете сценарий каждые 5 минут, и каждый раз, когда он запускается, выполнение сценария занимает 10 минут, тогда множественные экземпляры могут мешать друг другу.
  • Использование curl multi, вероятно, увеличит нагрузкуцелевому серверу, чем делать одиночные запросы в цикле, если вы хотите быть вежливым с целевым сервером, то, вероятно, лучше всего использовать одиночные запросы и немного поспать в цикле.время и ваш сервис очень популярны, вы можете получить постоянно расширяющуюся очередь на работу.Например, если вы получаете 40 задач в час и обрабатываете только 20 задач в час, вы никогда не достигнете конца очереди и очередь никогда не завершится.

HTH.

...