Saturday, August 15, 2026
HomePHPPause All Queues and a New artisan dev UI in Laravel 13.25

Pause All Queues and a New artisan dev UI in Laravel 13.25


Laravel 13.25 provides a worldwide pause change that stops each queue on each reference to one command, replaces the method runner behind artisan dev with a tabbed terminal UI, and lets an Picture occasion be returned straight from a route. The Laravel group launched v13.25.0 on August 11, 2026.

  • queue:pause --all and queue:resume --all, plus Queue::pauseAll() and Queue::resumeAll()
  • artisan dev runs by @laravel/multiplex with tabs, stream, and inline modes
  • Picture implements Responsable, good points Picture::fromStream(), and toFormat() is now public
  • A UniqueJobSkipped occasion, the timeout worth on JobTimedOut, and fail-on-timeout for notifications
  • withoutCookies() on responses and a foreignUlidFor() schema helper
  • Request::all() now prefers enter over recordsdata when the 2 collide

What’s New

Pause Each Queue on Each Connection

Laravel has been capable of pause a person queue for some time, however the granularity labored in opposition to you throughout a deployment. An utility with a dozen employees unfold over a number of named queues needed to pause every connection and queue pair by title, and people names change as options come and go. Reaching for upkeep mode as an alternative takes the entire web site down when all you wished was for employees to cease reserving jobs.

Each console instructions now take an --all flag:

php artisan queue:pause --all

php artisan queue:resume --all

The queue argument grew to become optionally available to make room for it, and the identical change is offered on the facade:

use IlluminateSupportFacadesQueue;

 

Queue::pauseAll();

Queue::resumeAll();

The worldwide change is a single cache key that employees examine alongside the per-queue keys, so isPaused() and getPausedQueues() report a queue as paused when both change is on. The 2 are impartial: resumeAll() clears the worldwide flag and leaves something you paused individually nonetheless paused, which is deliberate so a deploy script can’t by chance restart a queue any person parked on objective.

Two new occasions, QueuesPaused and QueuesResumed, hearth alongside the present per-queue QueuePaused and QueueResumed. Contributed by @jackbayliss in #61126.

Learn extra: Pause All Laravel Queues Throughout a Deploy

artisan dev Runs By means of @laravel/multiplex

The artisan dev command shelled out to concurrently, which interleaves each course of into one scrolling feed. A Vite rebuild and a queue employee and Pail all writing without delay makes discovering the road you care a couple of scrolling train.

It now runs by @laravel/multiplex, a terminal UI with every course of in its personal tab, search, per-process restart and log clearing, and automated restart of a course of that crashes. Three modes can be found, tabs (the default), stream (one interleaved feed you possibly can scroll and search), and inline (plain output, used mechanically when there isn’t a TTY). Decide one per run:

php artisan dev --stream

php artisan dev --timestamps --no-restart

Or set the default for the challenge in a service supplier:

use IlluminateFoundationDevCommands;

 

DevCommands::stream();

DevCommands::withTimestamps();

DevCommands::disableAutoRestart();

DevCommands::bufferSize(5000);

When the command exits, the buffered logs are printed to the primary terminal so nothing is misplaced on the best way out. Home windows falls again to concurrently, since multiplex presently helps macOS and Linux solely, and the Node flooring for the brand new path is v22.13. The total listing of modes, flags, and registration strategies is in the artisan dev terminal UI. Contributed by @joetannenbaum in #61100.

Photos as HTTP Responses

The first-party picture API may rework a picture and retailer it, however handing one again over HTTP meant calling toBytes() and assembling the response your self. Picture now implements Responsable, so a route can return the occasion:

use IlluminateSupportFacadesImage;

 

Route::get('/avatars/{consumer}', perform (Person $consumer) {

return Picture::fromStorage($consumer->avatar_path)

->cowl(200, 200)

->toWebp()

->high quality(80);

});

toResponse() returns a 200 with the processed bytes and a Content material-Kind learn from the output, so the header matches no matter format the pipeline produced quite than the supply file.

Two smaller additions in the identical space. Picture::fromStream() builds an occasion from a stream useful resource, studying it lazily and throwing an ImageException if the stream yields nothing:

$picture = Picture::fromStream(Storage::disk('s3')->readStream($path));

And toFormat() is now public, which replaces the match assertion you’d in any other case write to show a user-supplied format string into the suitable toWebp() or toAvif() name:

return Picture::fromUpload($request->file('picture'))

->toFormat($request->string('format'))

->high quality(80);

An unsupported format throws an ImageException quite than falling by. All three contributed by @calebdw in #61111, #61109, and #61110.

Queue Observability Additions

A job that’s not dispatched as a result of a ShouldBeUnique lock is held disappears with out a hint, which makes it laborious to inform a working uniqueness constraint from a lock that’s by no means launched. The brand new UniqueJobSkipped occasion carries the job that was dropped:

use IlluminateQueueEventsUniqueJobSkipped;

 

Occasion::hear(perform (UniqueJobSkipped $occasion) {

Log::data('Skipped distinctive job', ['job' => $event->job::class]);

});

It fires from PendingDispatch when the distinctive lock can’t be acquired, alongside the present JobDebounced occasion (#61039).

JobTimedOut gained a 3rd property, $timeout, holding the variety of seconds that was exceeded. A employee began with queue:work --timeout=120 applies its personal timeout to each job it runs, so with out the worth on the occasion there was no method to inform a job’s personal timeout from the employee’s (#61060).

Notifications now honor fail-on-timeout. SendQueuedNotifications reads a $failOnTimeout property or a #[FailOnTimeout] attribute off the notification, which issues when a timeout leaves you uncertain whether or not a 3rd social gathering already delivered the message (#61072):

use IlluminateQueueAttributesFailOnTimeout;

 

#[FailOnTimeout]

class OrderShipped extends Notification implements ShouldQueue

{

//

}

Lastly, QueueFake now assigns a uuid to faked jobs, so the queue inspection strategies return the identical form they do in opposition to an actual driver and utility code that reads $job->uuid is testable (#60966).

withoutCookies() on Responses

Expiring a number of cookies meant chaining withoutCookie() as soon as per title. The plural type takes an array:

return response('OK')->withoutCookies(['session', 'tracking', 'preferences']);

It loops over withoutCookie(), so the optionally available $path and $area arguments apply to each cookie within the array, and cookie cases work in addition to names. Contributed by @xurshudyan in #61115.

foreignUlidFor() Schema Helper

foreignIdFor() already detects the HasUlids trait and produces a ULID column, however there was no express helper to match foreignUuidFor(). The trio is now full:

$desk->foreignUlidFor(Person::class)->constrained();

The helper infers the column title, the associated desk, and the referenced key from the mannequin, producing a char(26) column and the matching overseas key constraint. Contributed by @talaridisTh in #61036.

Request::all() Prefers Enter Over Recordsdata

Request::all() merged the enter bag and the file bag with array_replace_recursive(), with recordsdata utilized final, so a file area and an enter area sharing a reputation resolved to the UploadedFile. The order is now reversed, and enter wins:

// POST with enter electronic mail=taylor@laravel.com and a file additionally named electronic mail

$request->all(); // ['email' => 'taylor@laravel.com']

$request->electronic mail; // 'taylor@laravel.com'

$request->file('electronic mail') // nonetheless the UploadedFile

Nested keys merge the identical means, so a profile.avatar file and a profile.title enter nonetheless each seem, with enter taking priority solely the place the keys really collide. file() is unaffected. Contributed by @taylorotwell in #61099.

Different Fixes and Enhancements

  • Http::globalOptions() and world middleware have been utilized to the framework’s personal cloud agent unix socket lengthy ballot, the place an choice like force_ip_resolve => v4 breaks the socket connection. A brand new Manufacturing facility::withoutGlobalConfiguration() closure isolates agent site visitors from application-level consumer configuration (#61064, #61068)
  • Queued broadcast occasions misplaced the true default for $deleteWhenMissingModels, so a mannequin deleted earlier than the employee picked up the job failed with a ModelNotFoundException as an alternative of being discarded (#61074)
  • Gate::forUser() copied skills, insurance policies, and callbacks however not the configured default denial response, so a gate arrange with Response::denyAsNotFound() fell again to the framework default (#61087)
  • Str::substrReplace() threw a TypeError on array arguments after the multibyte rewrite handed them straight to mb_substr(). Array calls now delegate to PHP’s native substr_replace() (#61105)
  • Backed enum queue names are revered when queueing mailables (#61066), queue drivers match the pretend for enum queue names (#61116), MailFake preserves queue decision on queued mailables (#61114), and bulk pushes to DatabaseQueue respect after-commit dispatch (#60996)
  • Deactivating cache-backed upkeep mode between the middleware’s two cache lookups threw a TypeError; the middleware now rechecks the state the identical means it already did for the file driver (#61121)
  • Container::name left entries on the construct stack when a dependency threw, so later resolutions noticed a stale stack (#61041)
  • Typed cache getters interpolated an enum key into the sort mismatch message, producing an Error as an alternative of the supposed InvalidArgumentException (#61056)
  • HEIC recordsdata reported incorrect dimensions (#61010), LazyCollection::flip() skips values that can not be array keys (#61081), and #[WithoutTimestamps] is checked when a mannequin decides whether or not to the touch (#61073)
  • Retry callbacks on asynchronous HTTP requests obtain the HTTP technique as a 3rd argument, matching synchronous requests, which beforehand brought on an ArgumentCountError (#61106)
  • Non-stream sources are rejected in HTTP pretend response our bodies (#61047), the Cloud log driver units a socket timeout (#61065, #61082), and signed URL assist was adjusted for Vapor (#61129)
  • schedule:listing converts timezones accurately for vary, step, and wildcard cron expressions (#60913), Manufacturing facility::insert() handles a rely of zero (#60911), and a failure whereas logging a deprecation not escalates to a deadly error (#60907)
  • Kind annotation fixes for Arr::prependKeysWith() (#61034), Str::numbers() (#61053), getMigrationBatches() (#60973), getRememberToken() (#61067), the route binding registrar (#61124), and ColumnDefinition::unsigned() (#61123)
  • Help for brick/math ^0.19 (#61133)

References

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments