あなたのためにこれを行う方法はありませんが、すでにあなたと同じ状況にあった人々の提案がいくつかあります。
->cron(*/20 * * * * *)
は、20秒ごとではなく、20分ごとにこれを実行すると言っています。 cronが分分の解像度に落とされないとすれば、これはおそらくLaravelがそれをサポートしていない理由です。これは本当に、私はここでは2つの組み合わせのために行くだろうごとに30秒以上を実行する必要がある場合
は:Laravel 5 schedule job every 30 secondsとLaravel 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();
}
ありがとうございました。 – shakir
あなたが役に立ったと思ったら、自由にupvoteと答えを受け入れるか – James