MySQL — Лучшая практика планирования задач PHP Laravel

Я создаю простое приложение, которое будет планировать включение / отключение набора объявлений в зависимости от времени, которое вводит пользователь.

Например, пользователь может захотеть показывать свои объявления с 6:00 до 9:00, а затем с 17:00 до 22:00 и выключать их в любое другое время.

Каков был бы лучший способ запланировать это? Я хотел бы хранить все данные в MYSQL. Должен ли я иметь cron / task, который каждую минуту проверяет строки в таблице, соответствующие времени, а затем функцию enable / disable?

Чтобы продолжить пример, таблица может содержать столбцы, время, функцию.

6 утра, включить
9 утра, отключить
5 вечера, включить
10 вечера, отключить

Мой вопрос: если у меня есть 10000 пользователей или около того, будет ли это слишком много для веб-сервера или есть более эффективный способ сделать это?

0

Решение

В подходе ниже, что мы делаем, это …

  1. Есть 2 таблицы — ads а также ad_timings который сохраняет разные начальное время а также время окончания за каждое объявление …
  2. Где экономят начальное время лайк 0600 а также время окончания лайк 0900. Итак, теперь вы просто проверите, если текущее время (скажем, его 2016-23-12 06:50:11) … Вы конвертируете это в 0650,
  3. Теперь вы узнаете все объявления, где начальное время меньше чем 650 а также время окончания Более того, чтобы узнать активные объявления и сделать обратное, чтобы остановить рекламу.
  4. Запускайте его каждые 10 минут … Дайте каждому пользователю минимальный интервал ввода 10 минут … Таким образом, вы будете запускать cron каждые 10 минут, а также сохранять память в фоновом режиме ….

Ваши столы

ad
id | name | current_status | ....
1 |  ... |      0         | .....

ad_timings
id | ad_id | start_time | end_time
1  |   1   |   600      |  900
1  |   1   |   1700     |  2200

Ваши модели

class Ad extends Model
{
public function timings()
{
return $this->hasMany('App\Models\AdTimings');
}
}

class AdTimings extends Model
{
protected $table = 'ad_timings';

public function ad()
{
return $this->belongsTo('App\Models\Ad')
}
}

В вашем планировщике

use Carbon\Carbon;
use App\Models\Ad;

class AdScheduler
{
public function handle()
{
$now = Carbon::now();

// This will convert current timestamp to something like
// Timestamp: 2016-12-23 23:36:11
// to
// Now: 2336
// Basically you are calculating time on the basis of hundreds..
// Like people say... 1300 hours... get me?
$now = $now->hour . $now->minute;

// These are the ads to run
// You can change their current_status field to 1 with update
$adsToRun = Ad::whereHas('timings', function($query) use ($now) {
return $query->where('start_time', '<=', $now)
->where('end_time', '>=', $now)
})->get();

// Ads to Stop
// You can change their current_status field to 0 with update
$adsToStop = Ad::whereHas('timings', function($query) use ($now) {
return $query->where('start_time', '>=', $now)
->where('end_time', '<=', $now)
})->get();
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]