당신을 위해이 작업을 수행 할 방법은 없습니다. 그러나 이미 당신과 같은 상황에 처한 사람들을위한 몇 가지 제안이 있습니다.
->cron(*/20 * * * * *)
실제로 20 분마다가 아니라 매 20 분마다 실행됩니다. cron이 초 분 해상도로 내려 가지 않는다는 것을 감안할 때 Laravel이이 문제를 지원하지 않는 이유 일 것입니다. 이 정말 매 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