Download the PHP package rawphp/warp without Composer

On this page you can find all versions of the php package rawphp/warp. 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 warp

Warp

A warm-worker test engine for Laravel + Pest.

Warp boots your Laravel application once per PHP process and hands each test a sandboxed shallow clone of it, instead of paying the full framework bootstrap (~50 ms) on every single test. Classic mode stays the default; warm mode is opt-in per run via WARP_MODE=1 and is designed to produce byte-identical outcomes to classic mode.

Host-app path: Getting started

Scope (product boundary)

Warp is a test-acceleration stack for Laravel + Pest, not a general test framework or CI platform. The package stops at the three surfaces already shipped. New work should deepen these jobs — not add adjacent products under the same name.

Warp is

Surface Job How you opt in
Warm engine Boot Laravel once per PHP process; hand each test a sandbox; fail loud on shared-state leaks; keep classic mode as the default and parity as the bar WARP_MODE=1 + InteractsWithWarmApplication
Snapshot DB Golden MySQL datadir + per-worker copy-on-write clones so parallel workers skip migrate/seed fixed cost WARP_DB=1 (optional; MySQL 8)
Timings + duration shards Record per-test durations and pack CI shards by time instead of file count WARP_TIMINGS=1, TimingExtension, bin/warp (merge / shard / timings)

Hard invariants (do not trade these away):

Warp is not

These belong elsewhere (another package, the host app, Pest/PHPUnit, or CI vendor tooling). Do not grow them into this repository without an explicit product decision to split packages:

Internal design notes may sketch later stages (see docs/specs/). Sketches are not the product boundary. Until something is listed under Warp is above (and shipped behind an opt-in flag), it is out of scope for this package.

Measured results

Measured on YardPilot's tests/Feature/Quotes suite (1,372 DB-backed tests):

Gate Result
A — per-test framework tax classic 53.57 ms/test → warm 0.55 ms/test (97.4× reduction)
B — outcome parity PARITY OK — all 1,372 tests byte-identical classic vs warm; full suite 2.8× faster warm

Measured on a large suite (18,921 tests, 12 parallel processes):

Metric Classic Warm
Duration 802.08s 314.23s
Failures 1 (timing assertion, run too slow) 0
Assertions 54,024 54,276

2.55× speedup, 60.8% reduction, 487.9s saved per run. The classic run's single failure was a timing assertion that blew out under the slower run — warm mode's run had zero failures, which illustrates a secondary benefit: warm mode eliminates timing-based test flakiness caused by slow cold-boot runs.

See docs/reports/2026-07-04-s1-gate.md for the full gate report and docs/specs/2026-07-04-warp-test-engine-design.md for the design.


Requirements

Warp's composer.json requires only php; every Illuminate class comes from the app that installs it (or from orchestra/testbench in Warp's own suite). This guarantees zero version conflicts when path-installed into a host app.

Installation

User documentation

Task-based guides for install, concepts, commands, configuration, and troubleshooting:

Design specs and gate reports remain under docs/reports/.

Usage

1. Add the trait to your base TestCase

Current Laravel already implements createApplication() on Illuminate\Foundation\Testing\TestCase. Warp’s trait overrides that method and needs a cold-boot hook: implement createClassicApplication() by delegating to the parent (the usual path for an empty host TestCase):

That's the whole integration. With WARP_MODE unset, the trait calls createClassicApplication() every time (classic behaviour). If you still ship a custom createApplication() on the class, move that body into createClassicApplication() instead of keeping both (see Getting started).

2. Run the suite warm

With Pest's --parallel, every paratest worker becomes warm automatically.

3. Customise the reset manifest (when needed)

A shallow clone of the application shares boot-resolved singletons between sandboxes. The ResetManifest handles them declaratively; ResetManifest::default() covers Laravel's own stateful services. Override warpResetManifest() to add app-specific ones:

ResetManifest primitives:

Method Purpose
forget(string ...$ids) Drop a stateful leaf service so the sandbox re-resolves it fresh (e.g. cache, session, view).
repoint(string $id, string $property) Rewrite a shared singleton's back-reference ($container/$app) to the sandbox without replacing the object (e.g. router, events, db).
flush(string $id, string $method) Call a public reset method on a per-test service (e.g. auth → forgetGuards).
add(Closure $step) A custom fn ($sandbox, $base) => … step for anything the primitives don't cover.

4. Escape hatch — force a classic boot

Some tests genuinely can't share a warm base. Opt them out and Warp gives them a fresh cold boot (and skips the hermeticity check):

or per-test with a Pest group:

Snapshot DB provisioning (S2)

WARP_DB=1 replaces the per-worker migrate:fresh/schema-load fixed cost with an instant copy-on-write clone of a golden datadir — a fully migrated MySQL data directory built once per schema change and cached under .warp/snapshots/ (add .warp/ to your app's .gitignore). Each worker gets its own throwaway mysqld on a private unix socket, so parallel workers can't collide by construction.

Requirements: MySQL 8 binaries on the machine (mysqld + mysqladmin; Homebrew, apt, or point WARP_DB_MYSQLD at one) and a mysql-driver test connection. Per-test isolation is unchanged — RefreshDatabase transaction-wraps as before; the golden snapshot just makes its migrate step a no-op.

Host wiring (required): the golden build runs as a subprocess with DB_CONNECTION, DB_SOCKET, DB_DATABASE, DB_USERNAME, and DB_PASSWORD injected into its env, pointed at the golden build mysqld. Other parent DB_* values (for example DB_HOST / DB_PORT) are inherited unless overridden in warp.db.build_env. Your test connection config must read the socket from that env var:

Without it, the build subprocess falls back to whatever socket your driver defaults to instead of the per-worker one warp provisioned — this can silently target the wrong database in a single process, and fails outright (SQLSTATE[HY000] [2002] No such file or directory) under --parallel.

Optional config, all under config('warp.db'):

Key Default Purpose
connection database.default Which connection to rewire (must be mysql driver)
database the connection's database Schema name baked into the snapshot
hash_paths database/migrations, database/seeders Files whose content keys the snapshot
build_command php artisan migrate --force Command that builds the schema (swap in --seed for a fixture universe)
build_env [] Extra env for the build command (wins over the injected DB_* vars)
snapshot_dir .warp/snapshots Golden snapshot cache (env: WARP_DB_SNAPSHOT_DIR)
runtime_dir /tmp/warp-db Clone + socket dir — keep it short, sockets live here (env: WARP_DB_RUNTIME_DIR)
mysqld auto-discovered Path to mysqld (env: WARP_DB_MYSQLD)

Tests that must commit (DDL, multi-connection assertions) can call $this->warpRecycleDatabase() for a fresh committed state via a sub-second re-clone from golden.

Timing capture + duration-balanced CI sharding (S3)

At 100k tests, count-based CI sharding leaves minutes on the table: shards get equal file counts but wildly unequal durations, and the run is as slow as the unluckiest shard. Warp records real per-test durations and packs shards to equal time instead — shard spread collapses to the mean.

1. Register the timing extension (one-time)

The extension is a no-op unless WARP_TIMINGS is set — with it unset, behaviour is byte-identical to before.

2. Record timings on full runs

Every test's duration lands in .warp/timings/ (override with WARP_TIMINGS_DIR), keyed per test with file attribution. Parallel workers write lock-free pending batches; warp merge is the explicit compaction step that folds them into timings.json. Run it once after recording, before persisting .warp/timings/ as a CI artifact/cache, and refresh that artifact on scheduled full runs. Record on full runs so every file gets measured weight. Method --filter runs upsert only (sibling test ids are retained): a file’s prior entries are superseded only when that file finished completely — every enumerated test terminated in that process.

Canonical root. Timing keys are anchored to the directory of the phpunit.xml actually used (its --configuration value, or the auto-discovered config), not to the working directory the run was launched from. This is the same root warp shard resolves discovered files against, so recording with pest -c sub/phpunit.xml from a parent directory and sharding with warp shard N/M --configuration=sub/phpunit.xml from that same parent produce intersecting keys. Only pure CLI-path runs with no XML config fall back to the current directory. The canonical root is stamped (absolute, realpath'd) into timings.json and every pending batch, and warp shard fails loudly (non-zero exit, naming both roots) rather than silently degrading if the artifact's root does not match the shard-time root.

warp shard and warp timings are read-only: they overlay pending batches in memory and do not rewrite the artifact, so read-only CI artifact restores are supported. WARP_TIMINGS_DIR is honored by every timing subcommand (merge, shard, and timings); pass --timings-dir=DIR when a command needs an explicit override. Inspect any time with:

3. Shard CI by duration

With no path arguments, warp shard discovers tests from phpunit.xml or phpunit.xml.dist testsuites, including configured directories, files, suffixes, prefixes, and excludes. Use --configuration=path/to/phpunit.xml to point at a non-default config. If no PHPUnit config exists, Warp falls back to tests/ discovery with the Test.php suffix; pass paths explicitly or use --suffix= to change that fallback.

warp shard weighs each discovered file by recorded duration (unmeasured files get the average) and LPT-packs them into equal-duration bins. Timing keys are paths relative to the canonical root — the phpunit.xml directory (see Record timings) — so tests, ./tests, and absolute paths inside the config root resolve to the same shard plan. The printed shard paths are relative to that same root, so they are directly runnable by PHPUnit/Pest when you invoke it from the same working directory with the same --configuration value you passed to warp shard. All CI nodes for a run must use the same Warp version: mixed versions across the canonical-key format change can compute divergent plans. Restore the same timings artifact on every shard of a run; if its stamped root does not match the shard-time root (for example, a --configuration pointing at a different config directory than the one recorded against), warp shard exits non-zero and names both roots instead of silently falling back to count-balanced.

With no timings recorded it degrades gracefully to count-balanced sharding (warning on stderr; stdout stays clean for $( ) consumption). Shard exit codes are:

Exit Meaning CI recipe consequence
0 Shard has files; stdout is the newline-delimited file list. Run Pest with FILES.
2 Usage, discovery, timings, zero discovered test files, or other shard error. Fail the job with the same code.
3 Empty shard (more shards than files). Skip cleanly; do not run Pest with an empty file list.

Use an exit-code-aware guard under sh -e; this exact contract is exercised by Warp's integration suite:

Pre-UR-011 timing artifacts are a clean break: delete old .warp/timings/ contents, record a fresh full run, run warp merge, and persist the new artifact.

How it works

Public API

Symbol Description
RawPHP\Warp\Concerns\InteractsWithWarmApplication The trait host TestCases use.
RawPHP\Warp\WarpMode::enabled(): bool true when WARP_MODE is 1, on, or true.
RawPHP\Warp\Attributes\Isolated Class attribute forcing a classic boot.
RawPHP\Warp\ResetManifest default() / forget() / repoint() / flush() / add().
RawPHP\Warp\WarmApplicationFactory sandbox() / base() / bootCount() / checkHermeticity() / scrap().
RawPHP\Warp\Sentinel\HermeticitySentinel Post-test leak detector.
RawPHP\Warp\WarpMode::databaseEnabled(): bool true when WARP_DB is 1, on, or true.
RawPHP\Warp\Db\SnapshotDatabaseManager apply() / recycle() / shutdown() — per-worker snapshot DB provisioning.
RawPHP\Warp\WarpMode::timingsEnabled(): bool true when WARP_TIMINGS is 1, on, or true.
RawPHP\Warp\Timing\TimingExtension PHPUnit extension recording per-test durations (register in phpunit.xml).
RawPHP\Warp\Timing\TimingStore load() / fileTotals() — the portable timings artifact I/O shell.
RawPHP\Warp\Shard\DurationBalancedSharder assign() — deterministic LPT shard packing.
bin/warp warp merge / warp shard <k>/<n> / warp timings CLI.

Benchmarks

The gate harness lives under bench/:

Development

Status

The warm-worker model is proven on real Laravel suites, from a few thousand tests up to large parallel runs. See the gate report for full methodology and results.


All versions of warp with dependencies

PHP Build Version
Package Version
Requires php Version ^8.4
phpunit/php-file-iterator Version ^5.0 || ^6.0
phpunit/phpunit Version ^11.1 || ^12.0
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 rawphp/warp contains the following files

Loading the files please wait ...