As developers, we continually strive for harmony in our craft — a balance between elegance and performance. Often, we find one at the cost of the other: elegant syntax that slows us down, or high performance wrapped in complexity.
Doppar brings both worlds together. It offers aristocratic elegance in syntax and uncompromising performance under the hood — a framework designed for developers who value both beauty and speed.
If you are building systems that demand real scalability, high concurrency, and reliable performance, Doppar is ready to power them.
Doppar is designed to feel expressive without giving away raw
throughput. To give that claim some concrete shape, here is a simple
real-world benchmark from a local Doppar application running on
Nginx + PHP-FPM + PHP 8.5 with wrk on Ubuntu 22.
The benchmark target was intentionally small and easy to reason about:
the / endpoint returning a single record from SQLite.
#[Route(uri: '/', name: 'home')]
public function welcome()
{
return User::find(1);
}This benchmark was run with the following setup:
- web server:
nginx - PHP runtime:
PHP 8.5 - process manager:
php-fpm - database:
SQLite - load generator:
wrkonUbuntu 22 - benchmark route:
/ - benchmark behavior: fetch
User::find(1)and return the model
The following wrk commands were used:
wrk -t2 -c50 -d20s http://localhost
wrk -t4 -c200 -d30s http://localhost
wrk -t8 -c500 -d60s http://localhostHere is the measured output summary:
| Threads | Connections | Duration | Avg Latency | Requests/sec | Transfer/sec | Notes |
|---|---|---|---|---|---|---|
2 |
50 |
20s |
24.16ms |
2066.98 |
1.23MB/s |
Stable baseline |
4 |
200 |
30s |
94.76ms |
2103.41 |
1.25MB/s |
Best throughput in this run |
8 |
500 |
60s |
252.25ms |
1959.45 |
1.17MB/s |
Saturation starts to show |
These three cards make the run easier to scan at a glance before reading the detailed interpretation.
As expected, latency rose as concurrency increased.
This benchmark is not meant to be a synthetic "hello world" victory lap. The endpoint still enters the framework, resolves routing, touches SQLite through the ORM, and returns a real model response.
Even with that full request path, Doppar sustained roughly 2,000 requests per second on this setup. The most balanced run in this set was:
4threads200connections30seconds2103.41requests/sec94.76msaverage latency
At the highest concurrency profile, throughput remained strong but the
system began to show pressure through higher latency and 604 socket
read errors. That is a useful signal: the benchmark did not collapse,
but it did reveal where this particular machine and stack started to
push beyond a comfortable steady state.
Benchmarks always depend on workload, hardware, web server tuning, database choice, opcode cache settings, and what the endpoint is actually doing. A JSON API, a rendered view, a cache hit, and a complex join-heavy query will all produce different numbers.
So treat this as a baseline snapshot of Doppar under a real but narrow workload:
- a real HTTP request
- a real ORM lookup
- a real SQLite-backed response
- a standard
nginx + php-fpmdeployment shape
That baseline is encouraging because it shows Doppar can stay expressive and still deliver strong request throughput on a straightforward PHP stack.
Welcome to the official learning hub for the Doppar PHP Framework. Here you will find easy-to-follow tutorials, practical examples, and beginner-friendly guides designed to help you master Doppar. Watch Tutorial