2016-08-06 13 views
0

UIを使用してバックグラウンドタスクを作成できるシステムがあります。
タスクの間隔は数時間ごとです(UIのユーザー選択)。laravelスケジューラを動的に追加する

ユーザーがui経由でタスクを作成するとき、スケジューラに動的に追加したいと思っています。

例として、これは静的で動的ではありません。

protected function schedule(Schedule $schedule) 
{ 
    $schedule->call(function() { 
     DB::table('recent_users')->delete(); 
    })->daily(); 
} 

可能ですか?そうでない場合、代替案は何ですか?

ありがとうございました

答えて

5

私はなぜそれができないのか分かりません。 php artisan schedule:runを実行するたびにKernel::scheduleメソッドが実行されます。ドキュメントのように設定する場合は、毎分cronを使用してください。

protected function schedule(Schedule $schedule) 
{ 
    // Get all tasks from the database 
    $tasks = Task::all(); 

    // Go through each task to dynamically set them up. 
    foreach ($tasks as $task) { 
     // Use the scheduler to add the task at its desired frequency 
     $schedule->call(function() use($task) { 
      // Run your task here 
      $task->execute(); 
     })->cron($task->frequency); 
    } 
} 

はあなたが保存内容に応じて、あなたがするのではなく、ここに好きなものを使用することができ、:あなたはこのような何かを行うことができない理由を念頭に置いて

* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1 

は、私が表示されませんCRON法。

$frequency = $task->frequency; // everyHour, everyMinute, twiceDaily etc. 
$schedule->call(function() { 
    $task->execute(); 
})->$frequency(); 

ここで注意すべき主なもの、スケジュールが実際にスケジュールされていないということです:あなたはLaravelの事前に定義された周波数の一つを表し、データベースに、あなたはこのような何かを行うことができ、その場合に格納されている文字列を持っているかもしれませんデータベースまたは管理しているcronのタスクスケジューラが実行されるたびに(毎分)実行され、各タスクに与えた頻度に基づいて実行するものが決定されます。

例:

  • あなたは->hourly()を使用して設定タスクを持って、それは、時間上で実行するために、すべての時間です。
  • 00:00には、スケジュールが実行され、->hourly()フィルタが通過します。これは、時間が1時間であるため、タスクが実行されるためです。
  • 00:01にスケジュールが実行されますが、今度は->hourly()フィルタが失敗するため、タスクは実行されません。
+0

私は再利用可能なコマンドで作業しています(唯一の欠点は、定義したコマンドと同じ#のパラメータを使用しなければならず、GUIが許可する任意のパラメータを動的に送信しないことです...)私のコマンドは、とにかく何のパラメータが来ているのかを知る必要があり、$署名で定義されたプリセット#を持つ必要があるため)これを行う方法を説明してくれてありがとう...これまでのところ私のコードです:https://github.com/armyofda12mnkeys/laravel-task-gui-linkage – armyofda12mnkeys

関連する問題