PHP Laravel任务调度最佳实践

时间:2016-12-22 17:11:35

标签: php mysql laravel cron task

我正在构建一个简单的应用程序,根据用户输入的时间安排启用/禁用广告集。

例如,用户可能希望广告的投放时间为上午6点至上午9点,然后是下午5点至晚上10点,其他时间则为其他广告。

安排此计划的最佳方法是什么?我会将所有数据存储在MYSQL中,如果我有一个cron / task来检查表中与时间匹配的行的每一分钟,然后是函数enable / disable?

要继续该示例,该表可能包含列,时间,函数。

早上6点,启用 上午9点,禁用 下午5点,启用 晚上10点,禁用

我的问题是,如果我有10,000个用户左右,这对于网络服务器来说是否太多,或者是否有更有效的方法来执行此操作?

1 个答案:

答案 0 :(得分:1)

在下面的方法中,我们正在做的是......

  1. 有2个表格 - adsad_timings,可为每个广告保存不同的 start_time end_time ...
  2. 在哪里保存 start_time ,例如 0600 end_time ,例如 0900 。所以,现在您只需检查当前时间(例如,2016-23-12 06:50:11)......您将其转换为0650
  3. 现在您发现 start_time 小于 650 end_time 的所有广告都超过了查找有效广告的广告广告停止的反面。
  4. 每隔10分钟运行一次......给每个用户一个10分钟的最小输入时间间隔......这样你每隔10分钟就可以运行一次cron并且还可以在后台节省内存....
  5. 你的桌子

    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();
      }
    }