задание cron в определенное время суток — каков предел?

#php #mysql #cron #crontab

#php #mysql #cron

Вопрос:

Мне нужен небольшой совет по использованию заданий Cron с PHP. Мой сценарий таков:

У меня есть веб-сайт с большим количеством подписчиков. У пользователей есть один или несколько URL-адресов, связанных с их учетной записью. В полночь (или в определенное время) Я хотел бы вызвать скрипт, который будет запрашивать веб-сайты для каждого пользователя и обновлять базу данных найденной информацией. Думайте об этом как о чем-то вроде службы очистки экрана.

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

Итак, если членство в c.5000 имеет по 2 URL-адреса у каждого — это 10000 веб-сайтов, к которым он будет запрашивать. Как люди думают, лучший способ сделать это? Есть задание cron, которое запускает первые 500 участников — затем через 10 минут запускает следующие 500 и т.д. И т.п…

или есть какая-то магия, о которой я не слышал, которая могла бы помочь!?

Спасибо за любые советы!

Ответ №1:

cron — отличный инструмент для использования с базовыми концепциями, подобными этой. Однако, как вы и предполагали, оно плохо масштабируется! Изучите инструменты обработки заданий, такие как open-source (и многоязычные) Gearman:

http://gearman.org/

Это должна быть более надежная система для выполнения поставленной задачи.

Комментарии:

1. Как указывали другие, этому нужно учиться. Я люблю cron, поверьте мне — я использую его для многих простых повторяющихся / запланированных задач. Но похоже, что в какой-то момент вам понадобится настоящий планировщик заданий, и изучать его, пока у вас есть время и нет острой необходимости, — лучшее решение, чем изучать его после того, как вы написали 800 строк пользовательского кода обработки ошибок на PHP. 🙂 (Если это звучит так, как будто я говорю по опыту …)

Ответ №2:

Я бы планировал скрипт ежедневно, чтобы скрипт запрашивал 10 000 веб-сайтов один за другим. Всего один скрипт, который перебирает все веб-сайты, отправляет запрос и обрабатывает результаты один за другим. Для такого рода чисел нет необходимости усложнять, имхо.

Комментарии:

1. Спасибо. Будет ли это масштабируемо? Я имею в виду, если сервис окажется популярным, у одного пользователя может быть 10, 20, 50 с лишним веб-сайтов. Я думаю, мне нужно подумать о взимании платы для покрытия расходов или что-то в этом роде. Может быть, просто сервер для штамповки обновлений весь день и другой для www.

2. Вы могли бы попробовать просто запустить скрипт на 10 000 веб-сайтах, посмотреть, сколько времени это займет. Я не думаю, что это займет так много времени. Убедитесь, что вы создали скрипт для запуска в соответствии с некоторыми параметрами (т. Е. начальным идентификатором, количеством веб-сайтов и т.д.), Чтобы в случае, если он станет популярным и вам понадобятся более сложные материалы, это было возможно с наименьшими усилиями.

3. Этот подход, безусловно, самый простой. Это также не будет масштабироваться и потребует много логики для проверки на наличие ошибок, возобновления работы с ошибками и так далее — все это было написано для вас в Gearman (который имеет расширение PHP).

4. @Kyle; ты вполне можешь быть прав, я не знаком с Gearman, я просто думаю о том, как бы я делал такого рода вещи.

5. @Lex: Я влюблен в cron; не поймите меня неправильно! Просто проблемы с обработкой ошибок и масштабируемостью заставляют вас писать тонны try / catch и пользовательских функций / классов для решения этих проблем, как только вы решаете, что cron — это правильный путь, и хотя кривая обучения Gearman круче, чем cron (в чем, в первую очередь, прелесть cron, я охотно признаю), преимущества слишком велики, чтобы их игнорировать. В какой-то момент веб-сайту операционной системы потребуется использовать планировщик заданий, и лучше всего начинать, когда задачи среднего размера, ИМХО.

Ответ №3:

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

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

С точки зрения реализации этого, я бы рассмотрел возможность принятия скриптом двух целых значений, которые позволяют вам определять модуль и остаток. Например. для четного числа вы определяете «2 0» и «2 1», что приведет к выполнению чего-то вроде SELECT * FROM myTable WHERE id % 2 == 0 и SELECT * FROM myTable WHERE id % 2 == 1 для базы данных SQL. Используя этот подход, было бы очень легко настроить любое количество заданий для параллельного выполнения.

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

Комментарии:

1. кажется, это имеет смысл — я просто пытаюсь все это понять. У меня был бы один скрипт, который, как вы сказали, запускается в 00: 00. Частота будет составлять каждую 1 минуту? Ранее с заданиями Cron я только что сказал запускать каждый час и т.д.

2. Вы бы запустили два cron-скрипта в полночь. Один с myscript 2 0 (четными), а другой как myscript 2 1 (коэффициентами). Они оба будут выполняться одновременно.