@@ -314,40 +314,19 @@ private function handleWork(QueueJob $work, QueueConfig $config, ?int $tries, ?i
314314 );
315315
316316 try {
317- // Load payload metadata
318- $ payloadMetadata = PayloadMetadata::fromArray ($ payload ['metadata ' ] ?? []);
319-
320- // Renew lock if needed
321- $ this ->renewLock ($ payloadMetadata );
322-
323- $ class = $ config ->resolveJobClass ($ payload ['job ' ]);
324- $ job = new $ class ($ payload ['data ' ]);
325- $ job ->process ();
326-
327- // Mark as done
328- service ('queue ' )->done ($ work );
329-
330- // Emit job processing completed event
331- QueueEventManager::jobProcessingCompleted (
332- handler: service ('queue ' )->name (),
333- queue: $ work ->queue ,
334- job: $ work ,
335- processingTime: microtime (true ) - $ startTime ,
336- metadata: [
337- 'worker_id ' => $ this ->workerId ,
338- ],
339- );
340-
341- CLI ::write ('The processing of this job was successful ' , 'green ' );
342-
343- // Check chained jobs
344- $ this ->processNextJobInChain ($ payloadMetadata );
345- } catch (Throwable $ err ) {
346- if (isset ($ job ) && ++$ work ->attempts < ($ tries ?? $ job ->getTries ())) {
347- // Schedule for later
348- service ('queue ' )->later ($ work , $ retryAfter ?? $ job ->getRetryAfter ());
349- } else {
350- // Mark as failed
317+ try {
318+ // Load payload metadata
319+ $ payloadMetadata = PayloadMetadata::fromArray ($ payload ['metadata ' ] ?? []);
320+
321+ // Renew lock if needed
322+ $ this ->renewLock ($ payloadMetadata );
323+
324+ $ class = $ config ->resolveJobClass ($ payload ['job ' ]);
325+ $ job = new $ class ($ payload ['data ' ]);
326+ } catch (Exception $ err ) {
327+ // Mark dispatch-time exceptions as failed jobs, but allow
328+ // PHP runtime errors to escape so the worker process can be
329+ // recycled with fresh runtime state.
351330 QueueEventManager::jobFailed (
352331 handler: service ('queue ' )->name (),
353332 queue: $ work ->queue ,
@@ -360,11 +339,58 @@ private function handleWork(QueueJob $work, QueueConfig $config, ?int $tries, ?i
360339 );
361340
362341 service ('queue ' )->failed ($ work , $ err , $ config ->keepFailedJobs );
342+ CLI ::write ('The processing of this job failed ' , 'red ' );
343+
344+ return ;
345+ }
346+
347+ try {
348+ $ job ->process ();
349+
350+ // Mark as done
351+ service ('queue ' )->done ($ work );
352+
353+ // Emit job processing completed event
354+ QueueEventManager::jobProcessingCompleted (
355+ handler: service ('queue ' )->name (),
356+ queue: $ work ->queue ,
357+ job: $ work ,
358+ processingTime: microtime (true ) - $ startTime ,
359+ metadata: [
360+ 'worker_id ' => $ this ->workerId ,
361+ ],
362+ );
363+
364+ CLI ::write ('The processing of this job was successful ' , 'green ' );
365+
366+ // Check chained jobs
367+ $ this ->processNextJobInChain ($ payloadMetadata );
368+ } catch (Throwable $ err ) {
369+ if (isset ($ job ) && ++$ work ->attempts < ($ tries ?? $ job ->getTries ())) {
370+ // Schedule for later
371+ service ('queue ' )->later ($ work , $ retryAfter ?? $ job ->getRetryAfter ());
372+ } else {
373+ // Mark as failed
374+ QueueEventManager::jobFailed (
375+ handler: service ('queue ' )->name (),
376+ queue: $ work ->queue ,
377+ job: $ work ,
378+ exception: $ err ,
379+ processingTime: microtime (true ) - $ startTime ,
380+ metadata: [
381+ 'worker_id ' => $ this ->workerId ,
382+ ],
383+ );
384+
385+ service ('queue ' )->failed ($ work , $ err , $ config ->keepFailedJobs );
386+ }
387+ CLI ::write ('The processing of this job failed ' , 'red ' );
363388 }
364- CLI ::write ('The processing of this job failed ' , 'red ' );
365389 } finally {
366390 // Remove lock if needed
367- $ this ->clearLock ($ payloadMetadata );
391+ if ($ payloadMetadata instanceof PayloadMetadata) {
392+ $ this ->clearLock ($ payloadMetadata );
393+ }
368394
369395 timer ()->stop ('work ' );
370396 CLI ::write (sprintf ('It took: %s sec ' , timer ()->getElapsedTime ('work ' )) . PHP_EOL , 'cyan ' );
0 commit comments