web-dev-qa-db-fra.com

Laravel travaux en file d'attente traités immédiatement, même avec un retard

Je développe actuellement mon application personnelle qui concerne les serveurs privés (par exemple, les serveurs Minecraft) et, comme l'interrogation du serveur prend un certain temps, j'ai décidé d'implémenter les travaux en file d'attente. Cependant, ils ne fonctionnent pas correctement et s'exécutent immédiatement lorsqu'ils sont appelés, même si ils sont retardés, ce qui entraîne une latence massive dans les requêtes de page.

Voici l'index de mon HomeController () qui appelle le travail pour mettre à jour chaque serveur avec un délai de 30 secondes:

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

La classe de travail qui met à jour les serveurs est la suivante:

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
       }
   }
}

Chaque fois que l'index de HomeController () est exécuté, il y a un retard considérable dans la demande de page, j'ai suivi le tutoriel de la page Web officielle de Laravel, j'ai essayé de trouver des réponses et rien.

Alors, qu'est-ce que je fais mal? Pourquoi le travail n'est-il pas retardé de 30 secondes, puis exécuté en arrière-plan sur mon serveur? Merci d'avance.

Aussi: le handle () fait ce qu'il est supposé faire, il interroge le serveur, envoie des paquets et met à jour ma base de données avec les informations correctes.

19
Micael Sousa

Vous devez configurer le pilote de file d'attente que vous souhaitez utiliser dans le fichier .env du répertoire racine de votre projet. 

Par défaut, le pilote de file d'attente est sync qui fait exactement ce que vous décrivez, en exécutant les files d'attente immédiatement. 

Vous pouvez choisir parmi différents pilotes de file d'attente tels que beanstalked ou redis (ce qui serait mon choix). Il y a un excellent billet de faveur sur laracasts.com à propos de la configuration d'une file d'attente avec haricot. 

Pour afficher toutes les options de pilote de file d'attente disponibles dans laravel, consultez la page here

Voici un exemple .env

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
23
bambam

Pour les personnes ayant effectué les modifications ci-dessus et ne fonctionnant toujours pas, vérifiez la valeur par défaut du fichier de file d'attente comme suit: dd(Config::get('queue.default'))

Pour moi, cela n'a pas changé jusqu'à ce que le cache de configuration soit vidé:

php artisan config:clear
5
Angjelin Serreqi

Si vous exécutez sur php artisan serve, redémarrez-le et exécutez à nouveau php artisan serve. Cela a fonctionné pour moi après les heures en essayant de me demander ce que c'était . :)

Cela me rendait fou pendant des siècles avant que je réalise que Laravel 5.7 a été renommé QUEUE_DRIVER en QUEUE_CONNECTION dans les fichiers .env

2
John Mellor

pour tester localement, vous pouvez définir le pilote à 

QUEUE_DRIVER=database 

et lancez php artisan queue: table puis php artisan migrate pour que votre file soit sauvegardée dans la base de données afin que vous puissiez voir ce qui se passe ..

et pour faire fonctionner vos files d'attente, lancez php artisan queue: écoutez .. et laissez-le fonctionner comme vous le feriez avec ArtServ

1
Rafael Milewski

Si vous exécutez des tests sur le service de file d’attente via phpunit, assurez-vous que 

<env name="QUEUE_DRIVER" value="X"/>

dans phpunit.xml ne remplace pas votre pilote de file d'attente souhaité.

1
thephper

Veiller à ce que 

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

dans config/queue.php et 

QUEUE_DRIVER=database 

dans un fichier .env pour vous assurer que le pilote de base de données est utilisé

1
TomH