Я создаю простое приложение, которое будет планировать включение / отключение набора объявлений в зависимости от времени, которое вводит пользователь.
Например, пользователь может захотеть показывать свои объявления с 6:00 до 9:00, а затем с 17:00 до 22:00 и выключать их в любое другое время.
Каков был бы лучший способ запланировать это? Я хотел бы хранить все данные в MYSQL. Должен ли я иметь cron / task, который каждую минуту проверяет строки в таблице, соответствующие времени, а затем функцию enable / disable?
Чтобы продолжить пример, таблица может содержать столбцы, время, функцию.
6 утра, включить
9 утра, отключить
5 вечера, включить
10 вечера, отключить
Мой вопрос: если у меня есть 10000 пользователей или около того, будет ли это слишком много для веб-сервера или есть более эффективный способ сделать это?
В подходе ниже, что мы делаем, это …
ads
а также ad_timings
который сохраняет разные начальное время а также время окончания за каждое объявление …2016-23-12 06:50:11
) … Вы конвертируете это в 0650
,Ваши столы
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();
}
}
Других решений пока нет …