2016-03-18 9 views
2

私の質問はもっと一般的な疑問です。私はLaravelを使って作成した2つのコマンドをAとBとしましょう。スケーラが更新されたとき、Laravelはどのように知っていますか?

これらのコマンドのそれぞれは - > dailyAt($ par)メソッドでスケジュールされています。しかし、$ parパラメータはクエリから来ます。

は、私はこのような何かを意味:

protected function schedule(Schedule $schedule) 
{ 
    $schedulerTime_commandA = App\Model\CommandsTime::where('id', 1)->first()->time; 
    $schedulerTime_commandB = App\Model\CommandsTime::where('id', 2)->first()->time; 

    $schedule->command('A') 
      ->dailyAt($schedulerTime_commandA); 

    $schedule->command('B') 
      ->dailyAt($schedulerTime_commandB); 
} 

スーパーユーザがこれらのコマンドを実行する時間をスケジュールしたいためです。ここで私の質問は:どのようにLaravelは、App \ Console \ Kernel.phpファイル内のこのスケジュールメソッドが変更されていることを知っている?

注:Laravelが次のように書いているので、私は次のcronエントリを持っています。

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

答えて

4

Laravelのスケジューラシステムが動作する方法は、それが(それはcronのエントリで* * * * *一部だ1分ごとに実行するcronジョブを使用している:毎年の毎月の毎日の毎時毎分にマッチ)。

毎分、php /path/to/artisan schedule:run >> /dev/null 2>&1がcronによって実行されています。

このコマンドを実行するときは、実行時にカーネルクラスschedule()メソッドで定義されているスケジュールを確認する必要があります。

技術的には、Laravelはスケジュール自体が変更されたことを知りません。実行する毎分schedule()メソッドを実行します。このメソッドはデータベースから最新の値を取得し、の特定の分に設定されているので、というスケジュールを返します。

cronのそれぞれの実行は、それ以前に来たものやそれを後に来るものについては何も知らない。

少なくともスケジューラを理解しています。私はコアラベルカーネルのコードで少し時間を過ごしただけですが、私は自分の経験から何が起こっているのかと考えています。

希望に役立ちます! 1


編集するだけLaravelのコードで私のロジックを確認しました。 cronスクリプトが実行されるたびに、スケジュールが再構築されるので、データベース内のスケジュールの変更は、次にcronエントリが実行されるときに使用されます。 Laravelはそれが実際に変更されたことを実際に知っていません - 実行するたびにチェックし、見つかったものを使用します。

具体的には、ここでチェーンが、それは興味があります場合は、コードをです:コマンドラインでphp artisanを呼び出す

  1. は、プロジェクトのルートに職人のファイルを実行します。
  2. 職人のファイルでは、アプリケーションはブートストラップされ、Kernelオブジェクトが初期化されます。
  3. Kernelクラスを初期化すると、Kernelクラスのコンストラクタ(Laravel \ Lumen \ Console \ Kernel)がdefineConsoleSchedule()メソッドを呼び出します。
  4. defineConsoleSchedule()メソッドは、空のScheduleオブジェクト(Illuminate \ Console \ Scheduling \ Schedule)を初期化します。
  5. 空のScheduleオブジェクトは、Kernelクラスのschedule()メソッドに渡されます。最後に
  6. コマンドスケジュールを定義したschedule()メソッドでは、2つのDBクエリが実行され、2つのスケジュールエントリは、その時点でDBが返す値で定義されます。

上記のアクションは、コンソールアプリケーションがブートストラップするたびに発生します。つまり、実行するコマンドに関係なく、php artisanを呼び出すたびに発生します。

スケジュールを実行している:runコマンド具体的には、ここでは次に何が起こるかです:アプリケーションのブートストラップ後

  1. 、ScheduleRunCommandオブジェクト(を照らし\コンソール\スケジューリング\ ScheduleRuneCommand)が初期化されます。
  2. fire()メソッドは、アプリケーションがブートストラップしたときにScheduleオブジェクトで定義されたすべてのコマンドを実行するScheduleRunCommandオブジェクトで呼び出されます。および
  3. コマンドを表すイベント(Illuminate \ Console \ Scheduling \ Event)のisDue()メソッドを呼び出すことによって、各コマンドをチェックして、その時点でコマンドを実行する必要があるかどうかを確認します。最後に
  4. isDue()から返すことによって、その分に実行する必要がある各コマンドが実行されます。
+0

で[Event.php](https://github.com/laravel/framework/blob/7f62d81acb2001faafb21a32544464ebfc92476c/src/Illuminate/Console/Scheduling/Event.phpは)あなたにもスケジュールのためのミューテックスのパスを見ることができる 'です/ framework/schedule- ' –

関連する問題