Laravel 13.34: Worker Crashes, Timeout Signals &amp; More | Mohamed Said       [Skip to content](#main)  [ ![](https://cdn.msaied.com/01KT78WE565VEMM3PSNQAAB0MH.png) Mohamed SaidLaravel Backend Engineer ](https://www.msaied.com/public) - [Home](https://www.msaied.com/public)
- [Projects](https://www.msaied.com/public/projects)
- [Articles](https://www.msaied.com/public/articles)
- [Certificates](https://www.msaied.com/public/certificates)
- [About](https://www.msaied.com/public#about)

           [  Contact](https://www.msaied.com/public#contact) Menu 

Menu
----

Close 

 - [HomeStart here](https://www.msaied.com/public)
- [ProjectsCase studies](https://www.msaied.com/public/projects)
- [ArticlesEngineering notes](https://www.msaied.com/public/articles)
- [CertificatesCredentials](https://www.msaied.com/public/certificates)
- [AboutHow I work](https://www.msaied.com/public#about)
- [ContactGet in touch](https://www.msaied.com/public#contact)

  [Start a conversation](https://www.msaied.com/public#contact) [WhatsApp](https://wa.me/201094619204) [Email](mailto:hello@msaied.com) 

 1. [Home](https://www.msaied.com/public)
2. /
3. [Articles](https://www.msaied.com/public/articles)
4. /
5. [Laravel](https://www.msaied.com/public/articles?category=laravel)
6. /
7. What's New in Laravel 13.34: Worker Crash Tracking, Timeout Signals, and More

   [Laravel](https://www.msaied.com/public/articles?category=laravel) 

 What's New in Laravel 13.34: Worker Crash Tracking, Timeout Signals, and More
==============================================================================

 Laravel 13.34 ships opt-in worker crash counting toward maxExceptions, SIGALRM notifications for interruptible jobs, a duration property on JobProcessed, targeted queue:flush, and several other quality-of-life improvements.

 ![](https://cdn.msaied.com/01M22N44A70A5MC2S599JP0MPH.webp) [Mohamed Said](https://www.msaied.com/public#person) Published 30 Sep 2026 · Updated 30 Sep 2026 · 3 min read

ShareCopy linkCopied

 ![What's New in Laravel 13.34: Worker Crash Tracking, Timeout Signals, and More](https://cdn.msaied.com/721/fce528b9143188e98a1629bc9d8f17b2.png) 

  On this page +1. [What's New in Laravel 13.34](#whats-new-in-laravel-1334)
2. [Count Worker Crashes Toward maxExceptions](#count-worker-crashes-toward-codemaxexceptionscode)
3. [Interruptible Jobs Receive SIGALRM Before a Timeout](#interruptible-jobs-receive-sigalrm-before-a-timeout)
4. [Job Duration on JobProcessed](#job-duration-on-codejobprocessedcode)
5. [Flush Failed Jobs for a Single Queue](#flush-failed-jobs-for-a-single-queue)
6. [Other Notable Changes](#other-notable-changes)
7. [Key Takeaways](#key-takeaways)

 What's New in Laravel 13.34
---------------------------

Laravel v13.34.0 was released on September 30, 2026, with a focused set of queue improvements alongside several bug fixes and smaller developer-experience enhancements. Here is a breakdown of the most notable changes.

---

Count Worker Crashes Toward `maxExceptions`
-------------------------------------------

A queued job that throws an exception already counts toward `$maxExceptions`, but a job whose worker dies mid-run — from an out-of-memory kill, a segfault, or a container restart — does not. William Julian-Vicary contributed the `#[CountCrashesAsExceptions]` attribute to close that gap.

```php
use Illuminate\Queue\Attributes\CountCrashesAsExceptions;
use Illuminate\Queue\Attributes\MaxExceptions;

#[MaxExceptions(3), CountCrashesAsExceptions]
class ProcessPodcast implements ShouldQueue
{
    public function retryUntil(): DateTime
    {
        return now()->addHour();
    }
}

```

Alternatively, set `public $countCrashesAsExceptions = true;` on the job class. The worker writes a cache key when it starts an opted-in job and removes it when the attempt finishes cleanly. If the key is still present on the next attempt, the previous run crashed, and the worker increments the exception counter. The feature is opt-in because it requires a `maxExceptions` value and adds two cache calls per attempt.

---

Interruptible Jobs Receive SIGALRM Before a Timeout
---------------------------------------------------

Jack Bayliss updated the worker so jobs that implement the `Interruptible` contract are notified via `SIGALRM` when they are about to time out. Previously, a timeout killed the worker without giving the job a chance to save state.

```php
use Illuminate\Contracts\Queue\Interruptible;

class GenerateReport implements ShouldQueue, Interruptible
{
    public function interrupted(int $signal): void
    {
        if ($signal === SIGALRM) {
            $this->saveProgress();
        }
    }
}

```

The worker also dispatches the `JobInterrupted` event (introduced in Laravel 13.31) and reports any exception thrown inside `interrupted()` without blocking the timeout.

---

Job Duration on `JobProcessed`
------------------------------

The `JobProcessed` event now carries a `duration` property (a float in milliseconds, rounded to two decimal places). Before this release, you had to listen for both `JobProcessing` and `JobProcessed` and compute the elapsed time yourself.

```php
use Illuminate\Queue\Events\JobProcessed;

Event::listen(function (JobProcessed $event) {
    Log::info("{$event->job->resolveName()} took {$event->duration}ms");
});

```

The value is `null` when the event is dispatched outside the worker context.

---

Flush Failed Jobs for a Single Queue
------------------------------------

`queue:flush` previously deleted every failed job across all queues. The new `--queue` option lets you target one queue at a time:

```bash
php artisan queue:flush --queue=sftp-sync

# Combine with --hours to keep recent failures
php artisan queue:flush --queue=sftp-sync --hours=48

```

---

Other Notable Changes
---------------------

- **`Schema::getColumn()`** — returns the details for a single column instead of the full `getColumns()` list; returns an empty array when the column does not exist.
- **`assertDatabaseCount()` accepts an array** — check multiple tables and counts in a single assertion call.
- **Enums in environment checks** — `App::environment()`, the scheduler's `environments()`, the `@env` Blade directive, and `Queue::isPaused()` now all accept backed enums.
- **`requireMorphMap()` enforced on reads** — an unmapped `*_type` value now throws a `ClassMorphViolationException` during lazy and eager loading, not only on save.

---

Key Takeaways
-------------

- Use `#[CountCrashesAsExceptions]` or `$countCrashesAsExceptions = true` to prevent runaway retries caused by worker crashes rather than thrown exceptions.
- Implement `Interruptible` and handle `SIGALRM` to save job progress before a timeout marks the job as failed.
- Read `$event->duration` from `JobProcessed` instead of manually tracking start times.
- Scope `queue:flush` to a single queue with `--queue` to avoid clearing unrelated failures.
- `Schema::getColumn()` is a convenient alternative to `getColumns()` when you only need one column's metadata.

---

[View the full Laravel 13.34 release notes on Laravel News →](https://laravel-news.com/laravel-13-34-0)

- [Laravel](https://www.msaied.com/public/articles?search=Laravel)
- [Queue](https://www.msaied.com/public/articles?search=Queue)
- [Laravel 13](https://www.msaied.com/public/articles?search=Laravel%2013)
- [Release](https://www.msaied.com/public/articles?search=Release)
- [PHP](https://www.msaied.com/public/articles?search=PHP)

 Frequently asked questions 
---------------------------

  What does the `#\[CountCrashesAsExceptions\]` attribute do in Laravel 13.34?It makes the queue worker count a crashed attempt (caused by an out-of-memory kill, segfault, or container stop) as one exception toward the job's `maxExceptions` limit. The worker uses a cache key to detect whether the previous attempt ended cleanly. The feature is opt-in because it requires a `maxExceptions` value and adds two cache calls per attempt.

   How does the new SIGALRM support help interruptible jobs?Before Laravel 13.34, a job timeout killed the worker without notifying the job. Now, jobs that implement the `Interruptible` contract receive a `SIGALRM` signal when they are about to time out, giving them a chance to save progress inside the `interrupted()` method before the attempt is marked as failed.

   Can I flush failed jobs for only one queue in Laravel 13.34?Yes. The `queue:flush` command now accepts a `--queue` option. Running `php artisan queue:flush --queue=sftp-sync` deletes failed jobs only from the `sftp-sync` queue, leaving failures on other queues untouched. You can combine it with `--hours` to preserve recent failures.

   ![Mohamed Said](https://cdn.msaied.com/01M22N44A70A5MC2S599JP0MPH.webp)About the author
----------------

[Mohamed Said](https://www.msaied.com/public#person)Senior Backend Engineer specializing in Laravel, scalable SaaS platforms, APIs, and cloud infrastructure. I build secure, high-performance web applications that help businesses grow.

[About](https://www.msaied.com/public#about) [GitHub ↗](https://github.com/EG-Mohamed) [LinkedIn ↗](https://www.linkedin.com/in/msaiedm/) [WhatsApp ↗](https://wa.me/201094619204) [Email Address ↗](mailto:hello@msaied.com) [My CV ↗](https://drive.google.com/file/u/0/d/1MF20IPRJyzfy32mhEutjL5EpSls0w2Q8/view)  

   [Previous articleMailbox for Laravel: Preview and Test Rendered Email Without a Separate Mail Service](https://www.msaied.com/public/articles/mailbox-for-laravel-preview-and-test-rendered-email-without-a-separate-mail-service) [Next articleFrankenPHP, OPcache JIT, and Preloading: Maximising Laravel Throughput](https://www.msaied.com/public/articles/frankenphp-opcache-jit-and-preloading-maximising-laravel-throughput-1)  

   On this page
-------------

1. [What's New in Laravel 13.34](#whats-new-in-laravel-1334)
2. [Count Worker Crashes Toward maxExceptions](#count-worker-crashes-toward-codemaxexceptionscode)
3. [Interruptible Jobs Receive SIGALRM Before a Timeout](#interruptible-jobs-receive-sigalrm-before-a-timeout)
4. [Job Duration on JobProcessed](#job-duration-on-codejobprocessedcode)
5. [Flush Failed Jobs for a Single Queue](#flush-failed-jobs-for-a-single-queue)
6. [Other Notable Changes](#other-notable-changes)
7. [Key Takeaways](#key-takeaways)

 ###  Have a technical challenge?

 Tell me what you’re building. I reply within two working days.

[Start a conversation](https://www.msaied.com/public#contact) 

   Related articles
-----------------

 [ ![](https://cdn.msaied.com/740/cce86edc21eddcbdd2f2454fadaf9c70.png)  · 3 min read### The Pipeline Pattern in Laravel: Custom Pipelines Beyond Middleware

5 Oct 2026 ](https://www.msaied.com/public/articles/the-pipeline-pattern-in-laravel-custom-pipelines-beyond-middleware-1) [ ![](https://cdn.msaied.com/739/2d6897fdcdcf090613f96f72a64b8a78.png)  · 4 min read### MySQL Full-Text Search in Laravel: Indexes, Relevance Scoring, and Boolean Mode

4 Oct 2026 ](https://www.msaied.com/public/articles/mysql-full-text-search-in-laravel-indexes-relevance-scoring-and-boolean-mode) [ ![](https://cdn.msaied.com/738/073696a3fefe18bec825beec5ac658f5.png)  · 4 min read### Laravel Queue Rate-Limited Middleware: Throttling Jobs Without Losing Work

4 Oct 2026 ](https://www.msaied.com/public/articles/laravel-queue-rate-limited-middleware-throttling-jobs-without-losing-work) 

  Have a technical challenge?
----------------------------

Tell me what you’re building. I reply within two working days.

 [Discuss your project ↗](https://www.msaied.com/public#contact) 

  © 2026 Mohamed Said · Built with Laravel, meant to last.Senior Backend Engineer specializing in Laravel, scalable SaaS platforms, APIs, and cloud infrastructure. I build secure, high-performance web applications that help businesses grow.

 - [Home](https://www.msaied.com/public)
- [Articles](https://www.msaied.com/public/articles)
- [Certificates](https://www.msaied.com/public/certificates)
- [GitHub](https://github.com/EG-Mohamed)
- [LinkedIn](https://www.linkedin.com/in/msaiedm/)
- [WhatsApp](https://wa.me/201094619204)
- [Email Address](mailto:hello@msaied.com)
- [My CV](https://drive.google.com/file/u/0/d/1MF20IPRJyzfy32mhEutjL5EpSls0w2Q8/view)
- [Sitemap](https://www.msaied.com/public/sitemap.xml)
