2017-10-12 7 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이이 문제를 지원하지 않는 이유 일 것입니다. 이 정말 매 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(); 
} 
+0

아이디어를 제공해 주셔서 감사합니다. – shakir

+1

유용하다고 생각되면 자유롭게 upvote 및/또는 대답을 수락하십시오. – James

0

것은 우리가 초 단위로 스케줄러를 처리 할 수 ​​있지만, 우리가 예를 실행하는 데 걸리는 많은 시간을 기준으로 시간의 우리의 방법 번호를 호출하여 일정() 메서드의 가까이를 사용자 정의 할 수 있습니다 :

$obj = new ClassName(); 

    $schedule->call(function() use ($obj) { 

      sleep(3); 
     //call method calculate time it takes and based on that we can call method number of methods we want 
      $obj->method(); //call method 
      sleep(3);  // pause of 3 seconds 
      $obj->method(); //call again 
      sleep(3); 
      $obj->method(); //call again 
      sleep(3); 

    })->everyMinute(); 

여기서 실행하는 데 걸리는 시간을 기준으로 1 분에 3 번 내 방법을 호출 할 수있었습니다. 감사합니다. 제 일이 끝났습니다.