Laravel Aufträge in der Warteschlange verarbeitet sofort auch mit einer Verzögerung
Ich bin derzeit an der Entwicklung meiner persönlichen app, die über private Server (zB. Minecraft-Server) und da das Abfragen der server einige Zeit dauert, habe ich beschlossen, Aufträge in der Warteschlange, aber Sie sind nicht ordnungsgemäß funktioniert, werden Sie sofort ausgeführt, wenn Sie aufgerufen werden, obwohl Sie sich verzögert, was zu einer massiven Latenz-Seite anfordern.
Hier mein HomeController index (), die fordert, den job zu jedem update-server mit einer 30-Sekunden-Verzögerung:
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 updates auf den Servern 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
}
}
}
Wenn der HomeController ist index() ist ran, es ist eine massive Verzögerung bei der Anforderung der Seite, ich folgte das tutorial auf Laravel Offiziellen Webseite, versucht, Antworten zu finden und nichts.
So, was mache ich falsch? Warum ist nicht der job, verzögert 30 Sekunden und dann tun Sie das im hintergrund in meinem server? Vielen Dank im Voraus.
Auch: Der Griff() tut, was es soll, es fragt den server, sendet die Pakete und updates meine Datenbank mit der richtigen info.
- Ich hatte Probleme mit
dispatch()
. Wenn ich wechselte zu\Queue::later(delay,job)
Dinge zu arbeiten begonnen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie, um den setup-queue-Treiber, die Sie verwenden möchten, in Ihr Projekt-root-Verzeichnis ist
.env
- Datei.Standardmäßig die Warteschlange-Treiber ist
sync
die genau das macht, was du beschreibst, Ausführung Warteschlangen sofort.Können Sie wählen Sie von einigen verschiedenen queue-Treiber wie beanstalked oder redis (die wäre meine Wahl). Es gibt eine ausgezeichnete freebie auf laracasts.com über das einrichten einer beanstalked Warteschlange.
Alle Warteschlange-Treiber-Optionen in laravel, haben Sie einen Blick hier.
Hier ein .env Beispiel
Für jemanden, der hat die oben genannten änderungen und wusste immer noch nicht funktioniert, prüfen Sie den Standardwert für die queue-Datei wie folgt:
dd(Config::get('queue.default'))
Es für mich nicht ändern, bis die Spülung des config-cache:
Diese wurde driving me crazy ewig, bevor ich gemerkt habe, dass Laravel 5.7 umbenannt QUEUE_DRIVER zu QUEUE_CONNECTION in der .env-Dateien
Wenn Sie
php artisan serve
, starten Sie dieses und führen Siephp artisan serve
wieder. Dieser arbeitete für mich, nach Stunden zu versuchen zu Fragen, was es war.🙂
zu lokal testen Sie könnte der Treiber
und führen php artisan Warteschlange:Tabelle
und dann php artisan migrate so würden Sie, Ihrer Warteschlange gespeichert in der db, so dass Sie optisch könnte se, was Los ist..
und führen Sie Ihre Warteschlangen einfach laufen php artisan Warteschlange:hören Sie .. und laufen lassen, wie Sie mit artisan dienen
queue:listen
Befehl für die Warteschlange, an die Arbeit! dankeSicherzustellen, dass
in config/queue.php und
in .env-Datei, damit die Datenbank-Treiber verwendet
Wenn Sie mit tests gegen den queue service durch phpunit, stellen Sie sicher, dass
in phpunit.xml nicht überschreiben Ihre gewünschte Warteschlange-Treiber.
Selbst wenn Sie alles konfiguriert haben, richtig das kann immer passieren. Wir hatten dieses problem mit Laravel 5.4, wo wir viele Arbeitsplätze geschaffen, etwas verspätet, und Sie Hinzugefügt, um die Warteschlange über
Queue:bulk($jobs)
. Dieser Ruf und auchQueue::push($job)
komplett ignorieren, diedelay
und führen den Auftrag sofort verarbeitet werden.Wenn Sie wollen, dass Ihr job in der Warteschlange, wie Sie es konfiguriert, rufen Sie
dispatch($job)
.