2015-06-27 10 views
16

Ich bin gerade dabei, meine persönliche App, die über private Server (zB Minecraft Server) ist zu entwickeln und seit Abfrage des Servers dauert einige Zeit, entschied ich, in der Warteschlange eingereiht Jobs, aber sie funktionieren nicht richtig, sie werden sofort ausgeführt, wenn sie aufgerufen werden, obwohl sie verzögert sind, was zu einer massiven Latenz bei der Seitenanforderung führt.Laravel Jobs in der Warteschlange verarbeitet sofort auch mit einer Verzögerung

Hier Index mein Homecontroller ist(), die den Job jeden Server mit einer Verzögerung von 30 Sekunden zu aktualisieren, ruft:

public function index() 
{ 
    $servers = Server::all(); 

    foreach($servers as $server) 
    { 
     //Job Dispatch 
     $job = (new UpdateServer($server->id))->delay(30); 
     $this->dispatch($job); 
    } 
    return view('serverlist.index', compact('servers')); 
} 

Die Job-Klasse, die die Server-Updates ist die folgende:

class UpdateServer extends Job implements SelfHandling, ShouldQueue 
{ 
    use InteractsWithQueue, SerializesModels; 
    protected $id; 

    public function __construct($id) 
    { 
     $this->id = $id; 
    } 

    public function handle(){ 
     $server = Server::findOrFail($this->id); 

     //preparing the packet 
     $test = new RAGBuffer(); 
     $test->addChar('255'); 
     $test->addChar('1'); 
     $test->addShort(1 | 8); 

     //finding the server 
     $serverGame = new RAGServer($server->server_ip); 

     //Get server info 
     $status = $serverGame->sendPacket($test); 

     $server->onlinePlayers = $status->getOnline(); 
     $server->peakPlayers = $status->getPeak(); 
     $server->maxPlayers = $status->getMax(); 

     if (!$server->save()) { 
      //error ocurred 
     } 
    } 
} 

Wann immer der Index des HomeControllers() wird ausgeführt, es kommt zu einer massiven Verzögerung der Seitenanforderung, ich habe das Tutorial auf der offiziellen Webseite von Laravel verfolgt und versucht, Antworten und nichts zu finden.

Also, was mache ich falsch? Warum wird der Job nicht um 30 Sekunden verzögert und dann im Hintergrund auf meinem Server ausgeführt? Vielen Dank im Voraus.

Auch: Der handle() macht was er soll, fragt den Server ab, sendet Pakete und aktualisiert meine Datenbank mit den richtigen Informationen.

+2

Ich hatte Probleme verwendet mit 'dispatch()'. Als ich zu '\ Queue :: spter wechselte (Verspätung, Job), begannen die Dinge zu arbeiten. – QuickDanger

Antwort

18

Sie müssen den Warteschlangentreiber einrichten, den Sie in der Datei .env Ihres Projekts verwenden möchten.

Standardmäßig ist der Warteschlangentreiber sync, der genau das ausführt, was Sie beschreiben und die Warteschlangen sofort ausführen.

Sie können aus verschiedenen Warteschlangentreibern wie Beanted oder Redis wählen (was meine Wahl wäre). Auf laracasts.com gibt es eine excellent freebie über das Einrichten einer BeanStalked-Warteschlange.

Um alle verfügbaren Warteschlangentreiberoptionen in Laravel anzuzeigen, werfen Sie einen Blick auf here.

Hier ist ein .env Beispiel

APP_ENV=local 
APP_DEBUG=true 
APP_KEY=SomeRandomString 

DB_HOST=localhost 
DB_DATABASE=homestead 
DB_USERNAME=homestead 
DB_PASSWORD=secret 

CACHE_DRIVER=file 
SESSION_DRIVER=file 
QUEUE_DRIVER=sync  //< put the desired driver here 

MAIL_DRIVER=smtp 
MAIL_HOST=mailtrap.io 
MAIL_PORT=2525 
MAIL_USERNAME=null 
MAIL_PASSWORD=null 
MAIL_ENCRYPTION=null 
+0

Danke für die Antwort, ich denke, ich werde versuchen, beanstalked Warteschlange dann, von dem, was ich verstehe, funktioniert es wie ein Hintergrundprozess richtig? Es wird die Ladezeit einer Seite oder irgendetwas nicht beeinflussen? –

+0

Sollte keinen Einfluss haben (abgesehen von der Bandbreite wenn du runterkommst oder etwas mit deinem Skript hochlädst, aber das sollte kein Problem sein). Beanstalked ist eine gute Wahl, wenn Sie dem Video innerhalb weniger Minuten folgen. – baao

+0

Schade, ich habe kein Konto in Laracasts, da es benötigt wird, werde versuchen, andere Tutorial zu folgen, wird Ihre Frage als akzeptiert markieren, sobald ich das zur Arbeit bekomme, danke für Ihre Zeit! –

1

lokal testen Sie den Treiber

QUEUE_DRIVER=database 

und laufen php Handwerker Warteschlange einstellen könnte: Tabelle und dann Handwerker PHP migrieren so Sie würden Ihre Warteschlange in der DB gespeichert bekommen, so dass Sie visuell sehen könnten, was los ist.

und zum Ausführen Ihrer Warteschlangen einfachen Lauf PHP Artisan Warteschlange: hören ..und lassen Sie ihn laufen, wie Sie mit handwerklicher tun

2

Für jemanden dienen, der die Änderungen oben und noch gemacht hat nicht funktioniert, überprüfen Sie den Standardwert der Warteschlange-Datei wie folgt: dd(Config::get('queue.default'))

Für mich ist es didn‘ t Änderung der Config Cache, bis Spülung:

php artisan config:clear 
+0

Für lokale Entwicklung Neustart der Handwerker-Server sollte den Trick tun (ich vergesse das oft) –

1

Stellen Sie sicher, dass

'default' => env('QUEUE_DRIVER', 'database'), 

in config/queue.php und

QUEUE_DRIVER=database 

in .env Datei, um die Datenbanktreiber, um sicherzustellen,

Verwandte Themen