Estoy tratando de enviar trabajos desde un controlador, pero a veces la cola funciona y, a veces, ejecuta el código de inmediato. Por otro lado, el envío desde un comando funciona bien, así que me pregunto cuál podría ser la diferencia.
Cosas que he probado:
proveedor/laravel/framework/src/Illuminate/Foundation/Bus/Dispatchable.php
public static function dispatch() { die('xxx'); return new PendingDispatch(new static(...func_get_args())); }Estoy tratando de encontrar lo que sucedió antes de la función de despacho, pero no puedo encontrar ninguna función que se ejecute antes de la función de manejo estático. Tengo la sensación de que algo está fallando en PHP y, alternativamente, ejecuto el trabajo de inmediato, pero no puedo encontrar dónde sucede eso en el núcleo.
Controlador
class CreateTestJob { public function __invoke(Request $request) { TestJob::dispatch(rand(0, 999999)); } }Trabajo
class TestJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public function __construct($test) { $this->test = $test; } public function handle() { sleep(30); echo 'done'; } }También traté de crear un error de sintaxis en la función de manejo de TestJob para poder ver el seguimiento de la pila, pero muestra "1 marco desconocido". me pregunto que es eso
puede verificar la tabla fail_jobs si hay algún error mientras ejecuta su trabajo.
El trabajo se ejecutará inmediatamente solo cuando use un controlador síncrono o un despacho síncrono (para uso en desarrollo local).
<?php Somejob::dispatchSync();
Los trabajos en Redis y la conexión a la base de datos se ejecutarán solo cuando ejecute el trabajador de la cola.
php artisan queue:work