Hello and Merry Christmas!

One of the main features of FrankenPHP is its worker mode, which lets you
keep a PHP application in memory to handle multiple HTTP requests.

Worker modes are becoming increasingly popular in the PHP world. Symfony
(Runtime Component), Laravel (Octane), and many projects based on these
frameworks (API Platform, Sulu...) now support a worker mode.

In addition to FrankenPHP, projects such as RoadRunner and Swoole provide
engines supporting worker modes.

According to benchmarks, worker modes can improve the performance of PHP
applications by up to 15 times.
In addition to FrankenPHP, which is basically a SAPI for Go's integrated
web server, a new generation of SAPIs is currently under development.
Several SAPIs written in Rust (including one by the RoadRunner team) are
currently under development.

These SAPIs, along with existing SAPIs, could benefit from a shared
infrastructure to build worker modes.



The FrankenPHP code is written and should be easy to move around in PHP
itself, to enable other SAPIs to use it.

In addition to sharing code, maintenance, performance optimization, etc.,
the existence of a common infrastructure would standardize the way worker
scripts are created and provide a high-level PHP API for writing worker
scripts that work with all SAPIs that rely on this new feature.

SAPIs will still have to handle fetching requests from the web server and
pausing the worker to wait for new requests (in FrankenPHP, we use
GoRoutines for this, in Rust or C, other primitives will have to be used),
but almost everything else could be shared.

For reference, here's the FrankenPHP code I propose to integrate into
libphp: https://github.com/dunglas/frankenphp/blob/main/frankenphp.c#L245

The public API is documented here:
https://frankenphp.dev/docs/worker/#custom-apps

I'd like to hear what the community thinks about this. Would you be
interested in this functionality in PHP? Should I work on an RFC?

If there's interest, I can work on a patch.

Cheers,
-- 
Kévin Dunglas

Reply via email to