2016-07-26 69 views
2

WebSockets経由で通知を連続して送信する必要があるプロジェクトがあります。文字列形式で全体のステータスを返すデバイスに接続する必要があります。システムはそれを処理し、さまざまな条件に基づいて通知を送信します。Laravel schedular:毎秒コマンドを実行する

スケジューラは1分早くタスクを繰り返すことができるので、毎秒その関数を実行する方法を見つける必要があります。

<?php  
    ...  
class Kernel extends ConsoleKernel 
{ 
    ... 
    protected function schedule(Schedule $schedule) 
    { 
     $schedule->call(function(){ 
      // connect to the device and process its response 
     })->everyMinute(); 
    } 
} 

PS:

は、ここに私のapp/Console/Kernel.phpであるあなたが状況に対処するために、より良いアイデアを持っている場合は、自分の考えを共有してください。

+1

秒ごとにトリガーするイベントループを使用してデーモン。このタスクには[icicle](https://icicle.io/)などのライブラリを使用し、予期せず終了した場合にはプロセスを起動するマネージャとして[supervisord](http://supervisord.org/)を使用できます。これは過剰なものと思われるかもしれませんが、問題の核心に達するまで、ある種のことは単純に見えます。継続的な更新が必要な場合は、これが方法です。 – Mjh

答えて

3

通常、1分より細かくする場合は、デーモンを作成する必要があります。

私は試してみることをお勧めします。今は数年前ほど難しくありません。

while (true) { 
    doPeriodicStuff(); 

    sleep(1); 
} 

一つ重要なこと:supervisord経由でデーモンを実行するだけでCLIコマンド内の単純なループで始まります。 Laravelのキューリスナー設定に関する記事を見ることができます。これは同じアプローチ(デーモン+スーパーバイザー)を使用しています。 configセクションは、次のようになります。

[program:your_daemon] 
command=php artisan your:command --env=your_environment 
directory=/path/to/laravel 
stdout_logfile=/path/to/laravel/app/storage/logs/your_command.log 
redirect_stderr=true 
autostart=true 
autorestart=true 
-2

sleep(1)を使用して、毎秒* 60回ジョブを試して複製することができます。

1
$schedule->call(function(){ 
    while (some-condition) { 
     runProcess(); 
    } 
})->name("someName")->withoutOverlapping(); 

あなたrunProcess()を実行するのにかかる時間に応じて、より多くの微調整を持っているsleep(seconds)を使用することができます。

some-conditionは通常、無限ループを制御できるようにいつでも変更できるフラグです。例えばfile_exists(path-to-flag-file)を使用して、必要なときに手動でプロセスを開始または停止することができます。

0

あなたはcronジョブ

* * * * * /usr/local/php56/bin/php56 /home/hamshahr/domains/hamshahrapp.com/project/artisan taxis:beFreeTaxis 1>> /dev/null 2>&1 

とコマンドでにコマンドを追加することができ、毎秒のために:

<?php 

namespace App\Console\Commands; 

use App\Contracts\Repositories\TaxiRepository; 
use App\Contracts\Repositories\TravelRepository; 
use App\Contracts\Repositories\TravelsRequestsDriversRepository; 
use Carbon\Carbon; 
use Illuminate\Console\Command; 

class beFreeRequest extends Command 
{ 
    /** 
    * The name and signature of the console command. 
    * 
    * @var string 
    */ 
    protected $signature = 'taxis:beFreeRequest'; 

    /** 
    * The console command description. 
    * 
    * @var string 
    */ 
    protected $description = 'change is active to 0 after 1 min if yet is 1'; 

    /** 
    * @var TravelsRequestsDriversRepository 
    */ 
    private $travelsRequestsDriversRepository; 

    /** 
    * Create a new command instance. 
    * @param TravelsRequestsDriversRepository $travelsRequestsDriversRepository 
    */ 
    public function __construct(
     TravelsRequestsDriversRepository $travelsRequestsDriversRepository 
    ) 
    { 
     parent::__construct(); 
     $this->travelsRequestsDriversRepository = $travelsRequestsDriversRepository; 
    } 

    /** 
    * Execute the console command. 
    * 
    * @return mixed 
    */ 
    public function handle() 
    { 
     $count = 0; 
     while ($count < 59) { 
      $startTime = Carbon::now(); 

      $this->travelsRequestsDriversRepository->beFreeRequestAfterTime(); 

      $endTime = Carbon::now(); 
      $totalDuration = $endTime->diffInSeconds($startTime); 
      if($totalDuration > 0) { 
       $count += $totalDuration; 
      } 
      else { 
       $count++; 
      } 
      sleep(1); 
     } 

    } 
} 
関連する問題