๐ One-command benchmark images โ Bootgly vs Swoole, Hyperf, React, Amp, RoadRunner & more
6.7K
bootgly/bootgly_benchmarks publishes the Bootgly PHP Frameworkโ
HTTP_Server_CLI TechEmpowerโ benchmark as
self-contained images: each tag bundles Bootgly + one opponent runtime + PostgreSQL
(which boots and seeds itself) and runs the whole benchmark from a single docker run โ
no install, no config, no database setup.
Sweep the server-worker count 1 โ 24 for Bootgly vs Swoole on the TechEmpower routes,
in a single run, and write the charts to ./results:
docker run --rm -v "$(pwd)/results:/bootgly/storage/tests/benchmarks" \
bootgly/bootgly_benchmarks:swoole \
test benchmark HTTP_Server_CLI --opponents=bootgly,swoole \
--loads=techempower:* --server-workers=1..24 --results=charts
The only requirement is a running Docker daemon. --server-workers=1..24 runs one round per
worker count in the same container; --results=charts writes per-round .bench.marks, a
Markdown report and native SVG charts (throughput / ratio / latency) to the mounted
./results directory โ so you get each framework's peak across the whole sweep, not a single
point. Drop the -v mount and --results=charts for a plain printed result.
Replace the image tag and the --opponents name:
docker run --rm -v "$(pwd)/results:/bootgly/storage/tests/benchmarks" \
bootgly/bootgly_benchmarks:<image> \
test benchmark HTTP_Server_CLI --opponents=bootgly,<opponent> \
--loads=techempower:* --server-workers=1..24 --results=charts
The <image> tag and the --opponents name are the same word:
<image> ยท <opponent> | Opponent runtime in the tag |
|---|---|
bootgly | (none) โ the harness with Bootgly alone, for a baseline run |
swoole | Swoole extension 6.2.2 |
workerman | Workerman 5.1.10 |
reactphp | ReactPHP โ react/http 1.11.0 |
amphp | AMPHP โ amphp/http-server 3.4.6 |
roadrunner | RoadRunner 2025.1.15 |
hyperf | Hyperf 3.2.0-rc.1 (on Swoole 6.2.2) |
laravel-octane | Laravel Octane 2.17.5 (Laravel 13.16.1, on Swoole 6.2.2) |
frankenphp | FrankenPHP 1.12.4 (embedded PHP 8.5.8) |
express | Express 5.2.1 (Node.js 22) |
bun | Bun 1.1.43 (Bun.serve) |
1..24 sweep is thorough but long โ step it with
--server-workers=1..24:4 (every 4th count), list points with --server-workers=1,4,8,16,
or pin one count with --server-workers=15.--loads=techempower:1,2 (plaintext + JSON).--format=json to print only a single JSON document (all rounds,
results and artifact paths).--connections=512 --duration=10.-e DB_HOST=โฆ -e DB_PORT=โฆ -e DB_NAME=โฆ -e DB_USER=โฆ -e DB_PASS=โฆ.Each tag is one build arg on top of the published framework image, and that base is
required โ there is no default, because bootgly/bootgly publishes no moving stable alias
and a default would freeze on a pre-release the day a stable ships:
docker build -f Dockerfile \
--build-arg BOOTGLY_FRAMEWORK_IMAGE=bootgly/bootgly:<version> \
--build-arg WITH_SWOOLE=1 \
-t bootgly_benchmarks:swoole .
Images are linux/amd64: FrankenPHP is pinned by an amd64 digest and RoadRunner and Bun ship
amd64 binaries. That is a property of the opponents, not an oversight.
| Image | What it is |
|---|---|
bootgly/bootgly.kitโ | the product โ framework + Console + Web + the kit entry |
bootgly/bootglyโ | the framework alone โ the base these harness images build FROM |
bootgly/bootgly_benchmarks | this harness, one tag per contender |
๐ Full harness, worker sweeps and result charts: https://github.com/bootgly/bootgly_benchmarksโ ยท ๐ Guide: https://docs.bootgly.com/guide/dockerโ ยท MIT
Content type
Image
Digest
sha256:5b6ec6fe4โฆ
Size
302 MB
Last updated
1 day ago
docker pull bootgly/bootgly_benchmarks:hyperf