laravel 5 - plano - Laravel trabajos en cola procesados inmediatamente incluso con un retraso
laravel segundo plano (7)
Actualmente estoy desarrollando mi aplicación personal que trata sobre servidores privados (por ejemplo, Servidores de Minecraft) y, como la consulta al servidor lleva algún tiempo, decidí implementar trabajos en cola, sin embargo, no funcionan correctamente, se ejecutan inmediatamente cuando se los llama, aunque se retrasan, causando una latencia masiva en la solicitud de página.
Aquí está el índice de mi HomeController () que llama al trabajo para actualizar cada servidor con un retraso de 30 segundos:
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 clase de trabajo que actualiza los servidores es la siguiente:
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
}
}
}
Cada vez que se ejecuta el índice HomeController (), hay un retraso masivo en la solicitud de la página, seguí el tutorial en la página web oficial de Laravel, intenté encontrar respuestas y nada.
Entonces, ¿qué estoy haciendo mal? ¿Por qué el trabajo no se retrasa 30 segundos y luego lo hace en segundo plano en mi servidor? Gracias de antemano.
Además: el controlador () está haciendo lo que se supone que debe hacer, consulta el servidor, envía paquetes y actualiza mi base de datos con la información correcta.
Asegurarse de que
''default'' => env(''QUEUE_DRIVER'', ''database''),
en config / queue.php y
QUEUE_DRIVER=database
en el archivo .env para asegurar que se use el controlador de la base de datos
Esto me estaba volviendo loco por años antes de darme cuenta de que Laravel 5.7 cambió su nombre a QUEUE_DRIVER a QUEUE_CONNECTION en los archivos .env
Para alguien que haya realizado los cambios anteriores y aún no haya funcionado, verifique el valor predeterminado del archivo de cola como este: dd(Config::get(''queue.default''))
Para mí no cambió hasta que se vació el caché de configuración:
php artisan config:clear
Si está ejecutando en php artisan serve
, reinícielo y ejecute nuevamente php artisan serve
. Esto me funcionó después de horas tratando de preguntarme qué era. :)
Si está ejecutando pruebas en el servicio de cola a través de phpunit, asegúrese de que
<env name="QUEUE_DRIVER" value="X"/>
en phpunit.xml no anula el controlador de cola deseado.
para probar localmente se puede configurar el controlador para
QUEUE_DRIVER=database
y ejecute php artisan queue: table y luego php artisan migrate para que pueda guardar su cola en la base de datos de manera que pueda ver visualmente lo que está pasando ...
y para ejecutar sus colas, ejecute simplemente php artisan queue: listen .. y deje que se ejecute como lo hace con artisan serve
.env
configurar el controlador de cola que desea usar en el archivo .env
del directorio raíz de su proyecto.
De forma predeterminada, el controlador de la cola está sync
que hace exactamente lo que usted describe, ejecutando las colas de inmediato.
Puede elegir entre algunos controladores de cola diferentes, como beanstalked o redis (que sería mi elección). Hay un excelente regalo de promoción en laracasts.com sobre la configuración de una cola hablada.
Para ver todas las opciones de controladores de cola disponibles en laravel, eche un vistazo here .
Aquí hay un ejemplo de .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