Skip to the content
Documentation
Help Start
Reading in:
  • German: 9,059 of 9,059 pages
About the help in other languages
All help pages

Application servers

The three ways Exponential is served - a web server with PHP-FPM, Exponential Velocity with persistent workers and a response cache, and FrankenPHP in classic mode - compared by process model, state between requests…

Download as PDF

Address: https://doc.exponential.earth/learninminutes/exphelp/viewer/help/software-engineers/application-servers.md

On this page

Application servers

This page is for engineers who choose how Exponential is served, or who need to know which runtime their code will meet. Since 6.0.15 Exponential ships its own application server, Exponential Velocity, and drives three engines with the same command and settings file. The source of truth is Velocity engines.

Contents

  1. The options
  2. Compared
  3. What the choice means for code
  4. Driving the engines
  5. Choosing

The options

  • A web server with PHP-FPM (Apache, nginx and the other servers the README lists). Every request starts PHP from a clean state. Exponential runs behind any web server that can rewrite a URL to index.php.
  • Exponential Velocity, engine qbix. A web server written in PHP: the parent loads the application once and forks persistent workers that serve many requests and are reset after each; a response cache can answer repeat public requests before a worker is used. As of 6.0.15 it is required by composer.json (se7enxweb/exponential-velocity), so every installation has it. The project calls it the recommended engine for every stage (Velocity is part of Exponential 6.0.15).
  • FrankenPHP, engine frankenphp. Caddy with PHP built in, one binary, downloaded by exp:velocity install and checked against a SHA-256 pin. PHP runs in classic mode (a clean state per request); worker mode is deliberately not offered (FrankenPHP).
  • PHP's built-in server, engine php: the shipped default in velocity.ini, because it needs nothing installed. For development only.

Compared

PHP-FPMVelocity (qbix)FrankenPHPphp -S
Role in the projecttraditional, fully supportedrecommended, every stageproduction-ready alternativedevelopment only
State between requestsnonea persistent worker, reset after each requestnone (classic mode)none
Response cachenoyes ([CacheSettings])not yetno
TLS and HTTP/2your web server'syesyesno
Graceful reloadsystemctl reload of the FPM servicere-exec, socket keptconfiguration reloadrestart
A class change is live afterreloading FPM (OPcache)exp:velocity restart or deployits reloadrestart

What the choice means for code

The same code runs under all of them, and the kernel's rule is that every change must keep working under PHP-FPM, Velocity and FrankenPHP. What the persistent model adds:

  • static properties, globals and registrations survive from one request to the next unless they are reset (Concurrency, statics and long-lived processes);
  • exit and die end the request, not the worker, through a compatibility layer; kernel code uses eZExecution::cleanExit();
  • a worker started before a deploy does not know a new class until it is restarted.

Driving the engines

php bin/php/console exp:velocity status                          # every engine: role, state, URL
php bin/php/console exp:velocity start                           # the default engine
php bin/php/console exp:velocity graceful                        # reload workers one at a time
php bin/php/console exp:velocity deploy --dry-run --allow-root-user

settings/velocity.ini [ServerSettings] Engine chooses the default engine (php shipped, qbix recommended, frankenphp). The verbs are the same for every engine: start, stop, graceful, restart, kill, status, deploy, command, config, install.

Choosing

SituationChoice
A new site, any stageVelocity, as the project recommends
A host that only offers PHP-FPMPHP-FPM behind its web server; everything works, without the response cache
One verified binary with TLS and HTTP/2, no persistent stateFrankenPHP
Code you do not trust in a long-lived process yetPHP-FPM or FrankenPHP until it is reviewed, or Velocity's forkPerRequest mode

Measure on your own pages before you decide (Performance measurement and benchmarks).

Become an Exponential Partner

Partners share their information, provide funding, contribute back and develop the products with us, and that is how Exponential grows. A partner website and dashboard are planned for mid-2027: please become a partner today to speed up our growth rate and land new features faster.

Something wrong on this page? Report an error

Documentation license

This documentation is free documentation, licensed under the GNU Free Documentation License 1.3 or later.

Exponential Copyright © 1998-2026 Exponential Foundation and 7x