2017-10-12 4 views
0

私はlaraveでいくつかのタスクをスケジューリングしようとしていますが、20秒ごとに自分のタスクをスケジュールするのが難しいと感じます。 laravel docを確認しています。 laravel schedularの場合、秒間かかる方法はありませんでした。 - > cron( '* * * * *' ') "カスタムCronスケジュールでタスクを実行する"がありますが、私の問題を解決することもできませんでした。私はLarvel 5で秒単位でスケジューラを使用することができます。#

以下はスケジューリングのためのkernal.phpファイルのコードです。

protected function schedule(Schedule $schedule) 
{ 
    // need to replace everyMinute() by some other method which can run it every 20 sec 

    $schedule->call('path\to\[email protected])->everyMinute(); 

    // also tried cron() but didn't workout. 
    $schedule->call('path\to\[email protected])->cron(*/20 * * * * *); 
}  

ありがとうございます。

答えて

2

あなたのためにこれを行う方法はありませんが、すでにあなたと同じ状況にあった人々の提案がいくつかあります。

->cron(*/20 * * * * *)は、20秒ごとではなく、20分ごとにこれを実行すると言っています。 cronが分分の解像度に落とされないとすれば、これはおそらくLaravelがそれをサポートしていない理由です。これは本当に、私はここでは2つの組み合わせのために行くだろうごとに30秒以上を実行する必要がある場合

は:Laravel 5 schedule job every 30 secondsLaravel schedular: execute a command every second

と言うことです。つまり、あなたはまだ、コマンド毎分を呼び出しますが、追加する必要がありますwithoutOverlapping()メソッドを使用するだけで安全です。

コード内でコードを実行し、20秒間スリープしてからもう一度実行し、20秒間スリープしてからもう一度実行してください。これは明らかにあなたのコードはほとんど瞬間的に実行されるという前提で機能します。 たとえば、コードの実行に5秒かかり、20秒間スリープしてからもう一度実行すると、コードは実際には25秒ごとに実行されます。

あなたは、このコードの実行にかかる時間についてかなり良い考えがあると思います。そうでない場合は、artisanコマンドを実行している間に手作業で時間を決めてください。このようなものはdate && php artisan your:command && dateに役立ちます。 これはシェルに日付を出力し、コマンドを実行して再度日付を出力します。これには実行に要する秒数を表示するための時間も含まれます。

これには、コントローラーアクションをコマンドにリファクタリングするか、コントローラアクションにsleep()コードを追加する必要があります。職人のコマンドのためのdocsはここで助けてください。

これをコマンドにリファクタリングすることをお勧めしますが、それはあなた次第です。

//Console command 
public function handle() 
{ 
    \App\Investment::calculate(); //takes 2 seconds to run 
    sleep(18); //sleep for 18 seconds to ensure we are only running the command every 20 seconds 
    \App\Investment::calculate(); //takes 2 seconds to run 
    sleep(18); 
    \App\Investment::calculate(); //takes 2 seconds to run 
} 


//The console scheduler - Kernel.php 
protected function schedule(Schedule $schedule) 
{  
    $schedule->call('path\to\[email protected])->everyMinute()->withoutOverlapping(); 
} 
+0

ありがとうございました。 – shakir

+1

あなたが役に立ったと思ったら、自由にupvoteと答えを受け入れるか – James

0

事は、我々は秒単位のスケジューラを扱うことはできませんが、我々はそれが例えばを実行するのにかかる時間に基づいて時間の私達の方法の番号を呼び出すことによって、スケジュールの近い()メソッドをカスタマイズすることができます:

ここでは、実行にかかる時間に基づいて1分で3回メソッドを呼び出すことができました。 私の仕事は終わった。

関連する問題