2016-07-26 24 views
2

Ich habe ein Projekt, das Benachrichtigungen über WebSockets kontinuierlich senden muss. Es sollte eine Verbindung zu einem Gerät herstellen, das den Gesamtstatus im Zeichenfolgenformat zurückgibt. Das System verarbeitet sie und sendet dann Benachrichtigungen basierend auf verschiedenen Bedingungen.Laravel Schedular: Ausführen eines Befehls jede Sekunde

Da der Scheduler eine Aufgabe so früh wie eine Minute wiederholen kann, muss ich eine Möglichkeit finden, die Funktion jede Sekunde auszuführen.

Hier ist meine app/Console/Kernel.php:

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

PS: Wenn Sie eine bessere Idee haben, um die Situation zu handhaben, geben Sie bitte Ihre Gedanken teilen.

+1

Ein Dämon mit Hilfe einer Ereignisschleife, die jede Sekunde auslöst. Sie können eine Bibliothek wie [icicle] (https://icicle.io/) für diese Aufgabe und [supervisord] (http://supervisord.org/) als Manager verwenden, der den Prozess startet, wenn er unerwartet beendet wird . Dies mag als Overkill erscheinen, aber gewisse Dinge sehen einfach aus, bis Sie den Kern des Problems kennen. Wenn Sie kontinuierliche Updates benötigen, ist dies der richtige Weg. – Mjh

Antwort

3

Normalerweise, wenn Sie mehr Granularität als 1 Minute wünschen, müssen Sie einen Daemon schreiben.

Ich rate Ihnen, es zu versuchen, jetzt ist es nicht so schwer wie es vor einigen Jahren war. Starten Sie einfach mit einer einfachen Schleife innerhalb eines CLI-Befehl:

while (true) { 
    doPeriodicStuff(); 

    sleep(1); 
} 

Eine wichtige Sache: den Daemon über supervisord laufen. Sie können sich Artikel über Laravels Warteschlangen-Listener-Setup ansehen, es verwendet den gleichen Ansatz (einen Daemon + Supervisord). Ein Konfigurations Abschnitt wie folgt aussehen:

[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

Sie können versuchen, die Jobs jede Sekunde * 60 Mal mit dem Schlafmodus (1) zu duplizieren.

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

Je nachdem, wie lange Ihre runProcess() auszuführen dauert, können Sie sleep(seconds) verwenden mehr Feinabstimmung zu haben.

some-condition ist normalerweise ein Flag, das Sie jederzeit ändern können, um die Endlosschleife zu steuern. z.B. Sie können file_exists(path-to-flag-file) verwenden, um den Prozess jederzeit manuell zu starten oder zu stoppen.

0

für pro Sekunde Sie Befehl cron-Job

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

und in Befehl hinzufügen:

<?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); 
     } 

    } 
} 
Verwandte Themen