PHPackages                             webpatser/fledge-framework - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. webpatser/fledge-framework

ActiveLibrary[Framework](/categories/framework)

webpatser/fledge-framework
==========================

The Fledge Framework — PHP 8.5 optimized Laravel.

v13.3.0.7(yesterday)09↑1233.3%MITPHPPHP ^8.5CI failing

Since Mar 17Pushed todayCompare

[ Source](https://github.com/webpatser/fledge-framework)[ Packagist](https://packagist.org/packages/webpatser/fledge-framework)[ Docs](https://github.com/webpatser/fledge-framework)[ RSS](/packages/webpatser-fledge-framework/feed)WikiDiscussions fledge-13 Synced today

READMEChangelogDependencies (124)Versions (13)Used By (0)

Fledge
======

[](#fledge)

**Laravel 13, optimized for PHP 8.5**

Named after Fledge from C.S. Lewis's Narnia — a horse transformed by Aslan into something faster and more capable. Laravel's name also comes from Narnia (Cair Paravel). Fledge transforms Laravel for PHP 8.5.

What is Fledge?
---------------

[](#what-is-fledge)

Fledge is a drop-in replacement for Laravel's `illuminate/framework` that requires PHP 8.5 and uses its native features for better performance. Same `Illuminate\` namespace, same API, full ecosystem compatibility.

Laravel 13 supports PHP 8.3+ and ships polyfills so it can run on older versions. Fledge removes those polyfills and version checks, and replaces `league/uri` with PHP 8.5's native URI extension — the single biggest performance win.

**52 files changed** on top of Laravel 13.4.0. All 13,382 framework tests pass.

Why?
----

[](#why)

Laravel supports PHP 8.3+ because that's the right call for the ecosystem. But if you're already on PHP 8.5, you're paying for compatibility you don't need:

- **11,000 lines of `league/uri` PHP code** replaced by compiled C in the PHP runtime
- **Symfony polyfills** for `array_first()`, `array_last()`, `array_all()`, `array_any()` — functions that ship natively in PHP 8.5
- **`version_compare` guards** that branch on every request to check if you're on 8.4+

Fledge strips all of that.

Performance
-----------

[](#performance)

### Real-World

[](#real-world)

MetricLaravel 13FledgeDifferenceHomepage render30ms25ms**17% faster**### Where the Speed Comes From

[](#where-the-speed-comes-from)

The main improvement is URI handling. Every HTTP request parses URIs — `$request->uri()`, the `url()` helper, redirects, route generation. Laravel uses `league/uri` for this. Fledge uses PHP 8.5's native `Uri\Rfc3986\Uri`, which is compiled C:

Operationleague/uriPHP 8.5 nativeParse URI0.047 ms0.0005 msModify URI0.24 ms0.0004 ms~100x faster for URI operations. Since URIs are touched on every request, it compounds into the 17% real-world improvement.

### Other Gains

[](#other-gains)

OperationImprovement`Arr::hasAll` / `Arr::hasAny`~6% faster (native `array_all`/`array_any`)Collection chains~5% fasterString pipelines~9% faster (pipe operator)No polyfill autoloadingFaster bootstrap### Fiber-Based Concurrency

[](#fiber-based-concurrency)

Fledge adds a `FiberDriver` to the Concurrency facade, powered by the [Revolt](https://revolt.run) event loop and [amphp](https://amphp.org). Unlike the `ProcessDriver` (which spawns child processes) or the `SyncDriver` (sequential), the `FiberDriver` provides real cooperative async I/O within a single process:

```
use Illuminate\Support\Facades\Concurrency;

// 3 HTTP requests run concurrently — total time ≈ slowest request
$results = Concurrency::driver('fiber')->run([
    fn () => $httpClient->request(new Request('https://api1.example.com'))->getBody()->buffer(),
    fn () => $httpClient->request(new Request('https://api2.example.com'))->getBody()->buffer(),
    fn () => $httpClient->request(new Request('https://api3.example.com'))->getBody()->buffer(),
]);
```

No background process needed — the Revolt event loop runs inline within the `run()` call. Tasks using amphp async drivers (HTTP, MySQL, Redis) genuinely interleave on I/O suspension. Shared memory, no serialization overhead, works in both web requests and CLI.

Also available as a standalone package for Laravel 11/12/13: [`webpatser/laravel-fiber`](https://github.com/webpatser/laravel-fiber)

### Non-Blocking Redis (amphp driver)

[](#non-blocking-redis-amphp-driver)

Fledge ships with `amphp/redis` as the **default Redis driver**. Every Redis call — cache reads, locks, queue operations, rate limiting — uses Fiber-based non-blocking I/O via the Revolt event loop.

```
// Every Cache::get() and Redis::get() is non-blocking by default.
// No code changes needed — the amphp driver is transparent.
Cache::get('key');        // non-blocking I/O under the hood
Redis::set('key', 'val'); // same

// Inside Concurrency::run(), multiple Redis calls parallelize automatically:
Concurrency::driver('fiber')->run([
    fn () => Cache::get('user:1'),
    fn () => Cache::get('user:2'),
    fn () => Cache::get('user:3'),
]); // all 3 reads happen concurrently
```

The `amphp` driver works from any context. From the main thread, each command still appears synchronous but uses non-blocking socket I/O. Inside a Fiber, multiple commands in separate Fibers execute in parallel.

To fall back to the synchronous phpredis C extension (e.g., for Redis Cluster, which amphp doesn't support):

```
REDIS_CLIENT=phpredis
```

The cache layer also includes Fiber-aware internals:

- **Lock blocking** suspends the Fiber instead of `usleep()`, letting other Fibers run
- **Failover reads** try all stores concurrently, returning the first success
- **Cluster operations** (`many()`/`putMany()`) run concurrent reads/writes via Fibers
- **Tag operations** flush chunks and write entries concurrently

What Changed
------------

[](#what-changed)

ChangeFilesImpactNative `Uri\Rfc3986\Uri` replacing `league/uri`3~100x faster URI opsRFC 3986 normalization layer (IDN, unicode, brackets)1Compatibility bridgeRemove `symfony/polyfill-php84` and `polyfill-php85`7Cleaner autoloadingBump PHP to `^8.5`37Drop compatibility codeRemove `version_compare` PHP 8.4 guards3No runtime branching`array_all`/`array_any` in `Arr::hasAll`/`hasAny`1Faster array checks`array_any` in `Handler::shouldntReport`1Replace `Arr::first` null check`array_any` in `FormRequest::isKnownField`1Replace foreach early-returnPipe operator in `Pipeline::then()`1Cleaner code`#[\NoDiscard]` on Pipeline, Cache, Container, Validation4Developer safetyPersistent cURL share manager3Connection pooling`json_validate()` fast path1Skip decode on invalid JSONFiber-based concurrency driver (Revolt + amphp)2Real async I/O in `Concurrency` facadeamphp/redis as default Redis driver5Non-blocking Redis I/O for all operationsFiber-aware cache layer (locks, failover, tags)8Concurrent cache ops inside FibersRedis required dependency for cache package1Redis is a first-class citizen### The RFC 3986 Problem (and How Fledge Solves It)

[](#the-rfc-3986-problem-and-how-fledge-solves-it)

PHP 8.5's native URI parser is strictly RFC 3986 compliant — stricter than `league/uri`. It rejects:

- Internationalized domain names like `bébé.be`
- Unicode in paths like `/日本語/page`
- Unencoded brackets in query strings like `?filter[status]=active`

[An attempt to add native URI support to Laravel](https://github.com/laravel/framework/pull/58132) stalled because of this strictness gap.

Fledge solves it with a normalization layer (`Uri::normalizeForRfc3986()`) that transparently converts these inputs before passing them to the native parser:

You writeFledge normalizes to`https://bébé.be``https://xn--bb-bjab.be` (punycode)`https://example.com/日本語``https://example.com/%E6%97%A5...` (percent-encoded)`?filter[status]=active``?filter%5Bstatus%5D=active` (encoded brackets)This makes Fledge a true drop-in replacement — your existing URLs keep working.

Installation
------------

[](#installation)

### In an existing Laravel 13 project

[](#in-an-existing-laravel-13-project)

```
# Add Fledge as a path repository (if local)
composer config repositories.fledge path /path/to/fledge/packages/framework

# Or as a VCS repository (from GitHub)
composer config repositories.fledge vcs https://github.com/webpatser/fledge

# Replace Laravel's framework with Fledge
composer require "laravel/framework:^13.3" -W
```

### From scratch

[](#from-scratch)

```
# Clone the full project (includes test app + framework)
git clone https://github.com/webpatser/fledge
cd fledge
composer install
```

Compatibility
-------------

[](#compatibility)

- Same `Illuminate\` namespace — all Laravel packages work unchanged
- Same API — no code changes needed in your application
- 13,382 tests passing (4 known Predis failures exist on vanilla Laravel 13 + PHP 8.5 too)

Requirements
------------

[](#requirements)

- **PHP 8.5+**
- **intl extension** (for IDN domain support)
- Composer 2.x

How This Project Works
----------------------

[](#how-this-project-works)

Fledge tracks Laravel's `13.x` branch. When Laravel releases a new version:

1. Fetch the latest upstream tag
2. Merge into the `fledge-13` branch
3. Resolve any conflicts in the ~50 modified files
4. Run the full test suite
5. Tag a matching Fledge release

The goal is automated sync for clean merges (~70% of releases), with manual intervention only when upstream touches the same files Fledge modifies.

### Versioning

[](#versioning)

Fledge uses a **fourth version segment** to track its own releases on top of Laravel's version:

LaravelFledgeMeaning`v13.3.0``v13.3.0.1`First Fledge release based on Laravel 13.3.0`v13.3.0``v13.3.0.2`Fledge-only fix on top of 13.3.0`v13.4.0``v13.4.0.1`Fledge synced to Laravel 13.4.0`v13.4.0``v13.4.0.2`PHP 8.5 optimizations on top of 13.4.0The first three segments always match the upstream Laravel version. The fourth is Fledge's own patch counter, starting at `.1` for each new Laravel release.

In your `composer.json`, `"laravel/framework": "^13.3"` will pull in the latest Fledge release.

### Project Structure

[](#project-structure)

```
packages/framework/     # The Fledge framework (forked illuminate/framework)
  ├── src/Illuminate/   # Modified Laravel source with PHP 8.5 optimizations
  └── tests/            # Unmodified Laravel test suite (tests are the contract)

```

**Rule: tests are never modified.** If a test fails after a Fledge change, the change is wrong, not the test.

Known PHP 8.5 Test Failures
---------------------------

[](#known-php-85-test-failures)

These 4 test failures exist on **vanilla Laravel 13 running on PHP 8.5** — they are not caused by Fledge:

TestRoot Cause`RedisConnectionTest::testItScansForKeys`Predis cursor format incompatibility`RedisConnectionTest::testItHscansForKeys`Predis cursor format incompatibility`RedisConnectionTest::testItZscansForKeys`Predis cursor format incompatibility`RedisConnectionTest::testItSscansForKeys`Predis cursor format incompatibilityCredits
-------

[](#credits)

**All credit goes to [Taylor Otwell](https://github.com/taylorotwell) and the [Laravel](https://laravel.com) team.** This project is built entirely on their work. Fledge is not a fork intended to compete with Laravel — it's an optimization layer for teams already running PHP 8.5.

License
-------

[](#license)

MIT — same as Laravel.

###  Health Score

47

—

FairBetter than 93% of packages

Maintenance100

Actively maintained with recent releases

Popularity7

Limited adoption so far

Community19

Small or concentrated contributor base

Maturity58

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 62.2% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~2 days

Total

12

Last Release

1d ago

PHP version history (2 changes)v13.0.0PHP ^8.3

v13.3.0.1PHP ^8.5

### Community

Maintainers

![](https://www.gravatar.com/avatar/e442a1d15a5b64438f3b471acfded80951afb1bed23641cfd80c5254099eab9d?d=identicon)[webpatser](/maintainers/webpatser)

---

Top Contributors

[![taylorotwell](https://avatars.githubusercontent.com/u/463230?v=4)](https://github.com/taylorotwell "taylorotwell (17261 commits)")[![GrahamCampbell](https://avatars.githubusercontent.com/u/2829600?v=4)](https://github.com/GrahamCampbell "GrahamCampbell (2238 commits)")[![driesvints](https://avatars.githubusercontent.com/u/594614?v=4)](https://github.com/driesvints "driesvints (1495 commits)")[![TBlindaruk](https://avatars.githubusercontent.com/u/12684601?v=4)](https://github.com/TBlindaruk "TBlindaruk (859 commits)")[![themsaid](https://avatars.githubusercontent.com/u/4332182?v=4)](https://github.com/themsaid "themsaid (857 commits)")[![lucasmichot](https://avatars.githubusercontent.com/u/513603?v=4)](https://github.com/lucasmichot "lucasmichot (702 commits)")[![crynobone](https://avatars.githubusercontent.com/u/172966?v=4)](https://github.com/crynobone "crynobone (574 commits)")[![StyleCIBot](https://avatars.githubusercontent.com/u/11048387?v=4)](https://github.com/StyleCIBot "StyleCIBot (370 commits)")[![JosephSilber](https://avatars.githubusercontent.com/u/1403741?v=4)](https://github.com/JosephSilber "JosephSilber (366 commits)")[![tillkruss](https://avatars.githubusercontent.com/u/665029?v=4)](https://github.com/tillkruss "tillkruss (354 commits)")[![nunomaduro](https://avatars.githubusercontent.com/u/5457236?v=4)](https://github.com/nunomaduro "nunomaduro (297 commits)")[![browner12](https://avatars.githubusercontent.com/u/5232313?v=4)](https://github.com/browner12 "browner12 (227 commits)")[![timacdonald](https://avatars.githubusercontent.com/u/24803032?v=4)](https://github.com/timacdonald "timacdonald (210 commits)")[![staudenmeir](https://avatars.githubusercontent.com/u/1853169?v=4)](https://github.com/staudenmeir "staudenmeir (191 commits)")[![imanghafoori1](https://avatars.githubusercontent.com/u/6961695?v=4)](https://github.com/imanghafoori1 "imanghafoori1 (178 commits)")[![vlakoff](https://avatars.githubusercontent.com/u/544424?v=4)](https://github.com/vlakoff "vlakoff (167 commits)")[![cosmastech](https://avatars.githubusercontent.com/u/42181698?v=4)](https://github.com/cosmastech "cosmastech (160 commits)")[![KennedyTedesco](https://avatars.githubusercontent.com/u/999232?v=4)](https://github.com/KennedyTedesco "KennedyTedesco (115 commits)")[![mnabialek](https://avatars.githubusercontent.com/u/7656807?v=4)](https://github.com/mnabialek "mnabialek (114 commits)")[![jackbayliss](https://avatars.githubusercontent.com/u/13621738?v=4)](https://github.com/jackbayliss "jackbayliss (110 commits)")

---

Tags

amphpasyncfiberfledgelaravelphp85asyncframeworklaravelphp85fiberfledge

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan, Rector

Code StyleLaravel Pint

Type Coverage Yes

### Embed Badge

![Health badge](/badges/webpatser-fledge-framework/health.svg)

```
[![Health](https://phpackages.com/badges/webpatser-fledge-framework/health.svg)](https://phpackages.com/packages/webpatser-fledge-framework)
```

###  Alternatives

[laravel/framework

The Laravel Framework.

34.6k509.9M16.8k](/packages/laravel-framework)[shopware/platform

The Shopware e-commerce core

3.3k1.5M3](/packages/shopware-platform)[contao/core-bundle

Contao Open Source CMS

1231.6M2.3k](/packages/contao-core-bundle)[shopware/core

Shopware platform is the core for all Shopware ecommerce products.

595.2M385](/packages/shopware-core)[sulu/sulu

Core framework that implements the functionality of the Sulu content management system

1.3k1.3M151](/packages/sulu-sulu)[open-dxp/opendxp

Content &amp; Product Management Framework (CMS/PIM)

7310.3k29](/packages/open-dxp-opendxp)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
