Revolt and the scheduler that sits under modern PHP concurrency
Revolt is a rock-solid event loop for concurrent PHP applications.
At a glance
- What is it?
- Revolt is the event loop package behind PHP 8.1 fiber based concurrency, offering the scheduler that libraries such as Amp and ReactPHP can sit on rather than a framework of its own. It suits engineers who need non-blocking I/O without giving up synchronous looking code.
- Who is it for?
- Adopt Revolt if you are writing concurrent PHP on PHP 8.1 or later and want a scheduler you can build on, or if you are maintaining a library that needs to sit on a common event loop alongside Amp and ReactPHP. Skip it if you need a framework with an opinionated application structure, because Revolt deliberately stops at the base layer, and if you are on PHP below 8.1, since the fiber support it relies on is not available there.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 4 days ago.
- What is it written in?
- Mainly PHP, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.
Editorial analysis
Why PHP needs a scheduler at all
A typical PHP application spends most of its life waiting. It sends a query to a database and then sits idle until the response arrives, and only then does the next piece of work begin. The execution model is synchronous and easy to follow, one thing at a time.
That waiting is the opportunity. Since PHP is single threaded, the idle time cannot be used to run something else unless the application opts into cooperative multitasking, where a task yields control while it waits so another task can proceed.
Libraries have offered this for a long time. Amp, ReactPHP and others brought cooperative multitasking to PHP, but their event-driven nature was incompatible with many existing interfaces, and adopting one meant adopting a different thinking model.
PHP 8.1 changed the picture by shipping fibers in the language itself. With fibers, calls can be synchronous without promises or callbacks while still allowing for non-blocking I/O. The awkwardness of the earlier generation disappears at the language level.
What fibers do not provide is a scheduler. Every application using cooperative multitasking needs exactly one event loop, and that is the single thing this package delivers.
A shared base rather than a framework, with Amp and ReactPHP still free to exist
The positioning here is unusually clear for a library, and it is worth reading before you install anything.
The documentation states that Revolt is not a full-blown framework for writing concurrent PHP applications, but only provides what is necessary as a common base. Different, strongly opinionated libraries can be built on top of it, and both Amp and ReactPHP will continue to co-exist.
That sentence is the design decision in a nutshell. Instead of trying to absorb the existing ecosystem, Revolt offers a shared foundation that opinionated layers can sit on. Revolt itself is described as the result of combining years of experience of Amp's and ReactPHP's event loop implementations, so the two projects that came before it are the reference points, not rivals being displaced.
Practically, this means your choice is between owning the scheduler yourself or delegating it. If you want one loop implementation shared by several libraries in the same process, this is the layer to standardise on.
Installing Revolt with Composer on PHP 8.1 and later
The installation claim in the documentation is worth repeating because it is unusual. It may surprise people to learn that the PHP standard library already has everything we need to write event-driven and non-blocking applications, and this package is installed as a Composer dependency on PHP 8.1 and later.
composer require revolt/event-loopThere is no extension to compile for the basic case. The one caveat is about scale. Applications with many concurrent file descriptors require one of the extensions linked from the documentation at revolt.run/extensions.
So the decision point is straightforward. A modest number of concurrent sockets is served by the package alone. Push the file descriptor count higher and you need to look at which extension covers your environment before you go further.
The documentation site at revolt.run and the examples directory in the repository are the two places the project points to next.
What the examples directory reveals about the API surface
The examples directory is the clearest picture of how the library is meant to be used, and its file names describe the API without needing a full manual.
Several files cover scheduling primitives directly: examples/timers.php, examples/ticks.php and examples/generate-yes.php deal with timers and tick callbacks. Others show the interaction with the standard input streams: examples/stdin.php, examples/consume-stdin.php and examples/stdin-timeout.php.
Then there are the fiber examples, examples/fiber-local-automatic.php and examples/fiber-local-manual.php, which show the two ways of associating state with the currently running fiber. That pairing suggests both an automatic mechanism and a manual one are supported, and the names imply the automatic form is the convenient default while the manual form gives explicit control.
The HTTP examples come in three shapes: examples/http-client-async.php, examples/http-client-blocking.php and examples/http-client-suspension.php. Read as a set they cover three distinct ways of interacting with a remote endpoint from inside a fiber based program, and there is also examples/http-server.php for the serving side. Two benchmark files, examples/benchmark-ticks.php and examples/benchmark-memory.php, plus several timer benchmark variants, suggest that tick handling and memory behaviour were worth measuring as the implementation matured.
One case where the event loop is the wrong answer
Concurrency is not free, and adopting a scheduler changes how your program behaves in ways that are easy to underestimate.
The first is blocking. An event loop only helps if the code inside it never blocks. A call that sits on the filesystem or on a blocking socket freezes every other task in the process, because the loop cannot advance while that call is outstanding. The examples directory includes an examples/invalid-callback-return.php file, which suggests callbacks that return the wrong thing are a documented failure mode rather than an accident, and any callback that blocks has the same effect on the whole loop.
The second is that a shared loop couples unrelated parts of a program. If several libraries each believe they own the scheduler, tasks interleave in ways that are difficult to reason about when one of them misbehaves. That is the problem a common base solves, and it is also a problem a shared base cannot fully remove.
The third is the version floor. Everything described here depends on fibers, which arrived in PHP 8.1. Code that must also run on older PHP versions cannot use this approach at all, and has to fall back to the promise and callback style that the documentation argues against.
Semantic versioning, the MIT licence and the shape of the repository
The package follows the semver semantic versioning specification, which is the right expectation for a base layer that other libraries depend on: a breaking change should not arrive inside a minor release.
The licence field on the repository says MIT, and the LICENSE file at the top of the tree holds the text. For a library that other packages depend on, that choice removes an obstacle to adoption, since it carries no requirement about how the calling application is itself licensed.
The repository layout shows a project with proper engineering conventions behind it. There is a .php-cs-fixer.dist.php configuration for code style, psalm.xml for static analysis and phpunit.xml.dist for the test suite, alongside .editorconfig and .gitattributes. Separate directories cover src, test, stubs, tools, examples and a CHANGELOG.md, a CONTRIBUTING.md and a SECURITY.md.
Release activity is slower than the code activity. The last push was on 2026-10-18 and the repository is not archived, while recent releases are v1.0.9 from 2026-05-16, v1.0.8 from 2025-11-27 and v1.0.7 from 2025-02-15. The version numbers sit at 1.0.x, which under semver means the API is considered stable, and the gap between the last push and the last release is normal for a library that ships when it is ready.
Editorial conclusion
Adopt Revolt if you are writing concurrent PHP on PHP 8.1 or later and want a scheduler you can build on, or if you are maintaining a library that needs to sit on a common event loop alongside Amp and ReactPHP. Skip it if you need a framework with an opinionated application structure, because Revolt deliberately stops at the base layer, and if you are on PHP below 8.1, since the fiber support it relies on is not available there. Before committing, run `composer require revolt/event-loop`, check the extension list at revolt.run/extensions for your expected number of concurrent file descriptors, and confirm that the libraries you already depend on can be adapted to this scheduler rather than insisting on their own.
Frequently asked questions
How do I install the Revolt event loop for PHP?
Add it as a Composer dependency on PHP 8.1 or later with composer require revolt/event-loop. Applications with many concurrent file descriptors additionally need one of the extensions listed at revolt.run/extensions.
Is Revolt a full framework for concurrent PHP applications?
No. The documentation states that it is not a full-blown framework but only provides what is necessary as a common base, with strongly opinionated libraries built on top of it. Amp and ReactPHP will continue to co-exist alongside it.
Why does Revolt require PHP 8.1 or later?
The package relies on fibers, which PHP 8.1 ships with. Fibers let calls stay synchronous without promises or callbacks while still allowing non-blocking I/O, so without them the underlying model is not available.
What licence is Revolt released under?
The licence field on the repository says MIT, with the full text in the LICENSE file at the top of the tree. The package follows the semver semantic versioning specification, and recent releases include v1.0.9.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/revoltphp-event-loop)Was this useful?