Download the PHP package yangusik/laravel-spawn without Composer

On this page you can find all versions of the php package yangusik/laravel-spawn. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

FAQ

After the download, you have to make one include require_once('vendor/autoload.php');. After that you have to import the classes with use statements.

Example:
If you use only one package a project is not needed. But if you use more then one package, without a project it is not possible to import the classes with use statements.

In general, it is recommended to use always a project to download your libraries. In an application normally there is more than one library needed.
Some PHP packages are not free to download and because of that hosted in private repositories. In this case some credentials are needed to access such packages. Please use the auth.json textarea to insert credentials, if a package is coming from a private repository. You can look here for more information.

  • Some hosting areas are not accessible by a terminal or SSH. Then it is not possible to use Composer.
  • To use Composer is sometimes complicated. Especially for beginners.
  • Composer needs much resources. Sometimes they are not available on a simple webspace.
  • If you are using private repositories you don't need to share your credentials. You can set up everything on our site and then you provide a simple download link to your team member.
  • Simplify your Composer build process. Use our own command line tool to download the vendor folder as binary. This makes your build process faster and you don't need to expose your credentials for private repositories.
Please rate this library. Is it a good library?

Informations about the package laravel-spawn

Laravel adapter for PHP TrueAsync — a PHP fork with a native coroutine scheduler and async I/O. Think Laravel Octane, but instead of Swoole or RoadRunner the runtime is TrueAsync.

One worker. Many requests. Zero threads. Each HTTP request runs in its own coroutine with isolated state — no shared memory, no leaks between requests.


How it works


Requirements


Installation

Via git repository:

Via local path:

Then run composer update.

The service provider is auto-discovered by Laravel.

Replace the Application class in bootstrap/app.php:

This is required for per-coroutine isolation of auth, session, and request. Without it the service adapters register correctly but state isolation does not work.

Publish the config:


Servers

True Async Server

Production-ready adapter using True Async Server in async worker mode.

Check config/async.php!

Dev server

Simple TCP socket server for local development. Analogous to php artisan serve.

FrankenPHP

Production-ready adapter using FrankenPHP in async worker mode. Requires the trueasync/php-true-async:latest-frankenphp Docker image.

A worker of your own

Any process that serves requests as coroutines calls one method to make the adapters per-request:

It applies the async.db_pool options and purges the connections bootstrap already opened, configures the Redis pool, tells the adapters that boot is over and switches the application into async mode — the three servers above do nothing else to start. TrueAsyncServer::initializeApp($app) is the same call for a thread of an application that has its own server.

An adapter that is never told boot is over is a no-op that reports nothing: AsyncViewFactory keeps answering from its process-wide state, so two coroutines rendering Blade share @section and @push. Under php-fpm that is the correct behaviour, since one process serves one request; under coroutines it is state shared between requests.


Docker quick start

TrueAsyncServer (better)

Dev server

FrankenPHP


Per-request services

A singleton lives as long as the worker and is shared by every request the worker is serving at that moment, so a service holding request state has to be declared per-request. The container gives every request its own instance, built on first resolve and kept in that request's coroutine context; its facade resolves per request as well.

Three registrations declare one, and the container treats them alike.

Laravel's own scoped() — the same call Octane packages already use:

The config list, for a package whose registration you do not control:

scopedSingleton(), when a shared binding has to stay in place: the factory here is used for the per-request build only, and whatever bootstrap resolved through the original binding stays reachable through scopedPrototype(). That is how this package scopes url without losing URL::forceScheme() and the other setters a provider called at boot.

Per-request does not fit everything. A service the framework or a package captures — kept in a static, taken in another singleton's constructor — must stay one object, or the capture pins one request's copy for the life of the worker. The view factory is the case: templates receive it as $__env, Component::$factory caches it, MailManager keeps it. It stays shared, and its render state moves into the request instead.

Boot-time configuration does not follow on its own. A provider calling Auth::extend() or Session::extend() configures the boot-time instance, and a fresh per-request instance starts without it. Register a seeder to carry it across:

Turn on async.diagnostics to have the worker report, at start-up, every per-request service that bootstrap configured and no seeder carries over — and every shared service holding an object that belongs to one request.

Configuration

config/async.php:

If you use TrueAsyncServer, pls read docs: Configuration


Benchmarks (Obsolete use TrueAsyncServer)

Check results in HttpArena

Load: 840 req/s /hello + 360 req/s /test = 1 200 req/s total · constant-arrival-rate · 30s · 12 workers each · WSL2 (Linux 6.6 on Windows)

Metric PHP-FPM (12w) Octane Swoole (12w) TrueAsync-Franken (12w)
Target rate 1 200 req/s 1 200 req/s 1 200 req/s
Actual throughput ~200 req/s ~752 req/s ~1 118 req/s
Dropped iterations ~28 000 ~5 000 20
Avg latency ~4 000ms ~880ms 13ms
p95 latency ~5 000ms 2 320ms 21ms
p95 < 200ms ✗ ✗ ✓
Failed requests 0% 0% 0%
DB connections (peak) — — 120

Why TrueAsync wins on DB-bound load

PHP-FPM Octane Swoole TrueAsync-Franken
Request model Process per request 1 process = 1 request at a time 1 worker = N coroutines
DB I/O Blocking (new conn each req) Blocking (PDO synchronous) Non-blocking (coroutine yield)
Memory model Stateless Long-lived process Long-lived process + coroutine context isolation
App bootstrap Every request Once per worker Once per worker

Swoole keeps the app in memory (avoids bootstrap cost) but PDO is still synchronous — a worker blocked on a DB call cannot accept another request. TrueAsync yields the coroutine on every DB call, so one worker handles hundreds of concurrent DB-bound requests without blocking.

Notes

Full benchmark: ta_benchmark

Raw PHP — TrueAsync vs Swoole (no framework, no I/O)

On pure CPU-bound workloads both servers cap at the same throughput (~10k req/s). With optimal Swoole config (ZTS, 16 reactor threads) Swoole is ~1.6x faster on P95 latency due to FrankenPHP's Go↔PHP boundary overhead (futex synchronization). On I/O-bound workloads this overhead is negligible.


Metrics

The running server's counters — requests, responses by status class, live connections per protocol, HTTP/2 and streaming traffic — are readable from the application under async:serve:

The package publishes no endpoint of its own, so the URL and who may read it stay yours. totals(), workers() and latency() return the same numbers as arrays. The counters are always incremented; async.server.stats decides whether the aggregate can be read, and it is on by default. See docs/METRICS.md.


Sessions

Database sessions (built-in fix)

The package automatically replaces Laravel's DatabaseSessionHandler with an async-safe version that uses upsert instead of INSERT + catch + UPDATE.

In a standard async server the HTTP response is sent before kernel->terminate() writes the session. If the client immediately sends the next request with the same cookie, two coroutines can race to INSERT the same session ID — causing duplicate-key warnings in the stock handler. The upsert is atomic, so this race is impossible regardless of concurrency.

No configuration needed. Works transparently when SESSION_DRIVER=database.

Redis sessions (recommended for production)

For high-concurrency workloads Redis sessions have lower overhead than database sessions and avoid any persistence race entirely:

Eloquent relations

Eloquent decides whether a relation adds its own where foreign_key = ? through Relation::$constraints, a static property. Eager loading switches it off while it builds the relation object and restores it afterwards from a captured value. A static property is one flag per worker thread, shared by every coroutine of that worker, so under concurrent serving that window belongs to whoever happens to be inside it: one request's relations come out unfiltered because another request was eager loading at that moment, and two overlapping windows leave the flag off for the rest of the worker's life. The queries stay valid and answer with the whole table.

Nothing to do — the package puts its own copies of two Eloquent files in front of Laravel's, Relations\Relation and Concerns\HasRelationships. The first keeps that window in the coroutine that opened it; the second builds relation classes that read it. Every model is covered, including the ones that come from other packages.

The copies live in overrides/laravel-13/, beside the one this package already keeps for Telescope, and are frozen against the Laravel release they were taken from — 13.26.1, the floor of the ^13.26.1 that composer.json requires — so each carries the checksum of the file behind it. A release that touches either file leaves the application on Laravel's own classes rather than on a copy that has fallen behind; the worker writes the reason to stderr at start-up, and EloquentOverrides::status() answers it at any time. SPAWN_ELOQUENT_OVERRIDES=0 switches the copies off.


License

MIT


All versions of laravel-spawn with dependencies

PHP Build Version
Package Version
Requires php Version ^8.6
laravel/framework Version ~13.26.1
ext-pcntl Version *
ext-pdo Version *
Composer command for our command line client (download client) This client runs in each environment. You don't need a specific PHP version etc. The first 20 API calls are free. Standard composer command

The package yangusik/laravel-spawn contains the following files

Loading the files please wait ...