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

Server control commands: exp:webserver, exp:frankenphp and exp:solr

This page is for administrators who start, stop and configure the servers an Exponential installation runs beside PHP. Three console commands added on 25 and 26 September 2026 control them: the web server (any of the…

Download as PDF

Address: https://doc.exponential.earth/exphelp/viewer/features/6.0/web-server-and-solr-commands.md

On this page

Server control commands: exp:webserver, exp:frankenphp and exp:solr

This page is for administrators who start, stop and configure the servers an Exponential installation runs beside PHP. Three console commands added on 25 and 26 September 2026 control them: the web server (any of the three Velocity engines) and an optional Solr search server. They share one controller with Velocity, so every verb behaves the same whichever name you type.

Run them as ./console exp:<name> <verb>. As root add --allow-root-user. ./console exp:<name> --help --allow-root-user prints the full help from which this page is taken.

exp:webserver: one command for whichever engine you run

exp:webserver is the engine-agnostic front end. Use it when you do not care whether the engine is PHP's built-in server (development), FrankenPHP (production) or the bundled Qbix server.

VerbWhat it does
status (default)What each engine is doing.
startConfigure on first use, then run the engine.
stop, restartAsk it to stop and wait; stop then start.
gracefulRe-exec without dropping the listening socket.
killStop without asking, for a wedged worker.
configureResolve and save the engine, port, document root and HTTPS port into settings/override/velocity.ini.append.php without starting anything; --dry-run shows the plan only.
commandPrint the command line it would run, and exit.
configRead and write the settings it runs on.
cacheCache clear: re-render every cached page on its next request.
layoutThe configuration tree and every file the server uses.
ctlThe engine's own control with this installation's tree.
installPut the engine's binary in place.

--engine=<name> and --all reach the other engines for start, stop, restart, graceful, kill and status. Each engine has its own port, pid file and logs, so they can run side by side.

Configure once, then run directly. The first start with no saved engine works out the effective engine, port, document root and HTTPS port and writes them to the installation's override; every later start runs straight from it. To change that without editing the INI file:

./console exp:webserver configure --engine=frankenphp --port=8089 --dry-run --allow-root-user   # plan only
./console exp:webserver configure --apply --engine=frankenphp --port=8089 --allow-root-user             # persist, start nothing
./console exp:webserver start --reconfigure --engine=php --port=8087 --allow-root-user          # persist, then run

configure rewrites only those keys and leaves certificates and PHP ini options untouched.

exp:frankenphp: the same command pinned to FrankenPHP

./console exp:frankenphp <verb> is exp:velocity <verb> --engine=frankenphp. Its intended alias exp:fp is declared in the command's docblock but is not resolved by the console on this tree (checked 2 October 2026: "Command exp:fp was not found"); type exp:frankenphp. Verbs: status, start, stop, restart, graceful, kill, command, config, cache, ctl (caddyfile, validate, adapt, version, list-modules) and install (download the pinned FrankenPHP release and verify its SHA-256; --force, --from=<file>, --check, --trust-github-digest).

./console exp:frankenphp install --check --allow-root-user   # is the pinned binary in place?
./console exp:frankenphp status --allow-root-user
./console exp:frankenphp ctl validate --allow-root-user       # validate the generated Caddyfile (prints "Valid configuration")

Address and ports come from [FrankenPHPSettings] in settings/velocity.ini (Port=8089 for plain HTTP, HTTPSPort=8444 for TLS, HTTPS=enabled). HTTPS is on by default with a self-signed certificate unless [HTTPSSettings] names one (Certificate and Key, both or neither); --https and --no-https force it for a single start. If the certificate cannot be made (no openssl extension, an unwritable directory) the default starts plain HTTP and says why; --https or a named certificate that does not exist refuses the start.

Two fixes of the same days matter if you ran FrankenPHP earlier:

  • Signing in works. FrankenPHP passes every php_ini line of the generated Caddyfile to PHP as INI text, where a semicolon starts a comment, so session.save_path "0;0660;<dir>" arrived as 0, no session file was found and every visitor was anonymous. Values PHP's INI parser would cut are now quoted.
  • The built-in PHP engine starts beside HTTPS on another engine. It speaks plain HTTP only but counted the shared HTTPSPort another engine serves (for example Qbix on 8080) as its own and refused an otherwise free start.

The reasons and the Caddyfile that is generated are in FrankenPHP and PHP's built-in server.

exp:solr: an optional search server

Solr is optional. Exponential searches with its built-in index (php bin/php/updatesearchindex.php) until Solr is installed and switched on; until then every verb says so and start exits non-zero, so nothing pretends a search server is running. (A docblock alias exp:search exists but is not resolved by the console on this tree; use exp:solr.)

VerbWhat it does
statusWhether Solr is configured and, if so, whether it answers.
start, stop, restartRun Solr's own start and stop for a local instance (BinaryPath); with a remote Url they report that it is managed elsewhere.
pingAsk Solr whether it is alive.

settings/solr.ini (override in settings/override/solr.ini.append.php), block [SolrSettings], scope: the installation:

KeyDefaultMeaning
EnabledfalseSolr takes over only when true.
UrlemptyA running Solr to talk to; with it set Solr is treated as remote and start/stop do nothing.
BinaryPathemptyThe Solr control binary, for a local instance (used when Url is empty).
Host, Port127.0.0.1, 8983Where Solr listens.
DataDiremptySolr's data directory.
RunDir, LogDirvar/vc/solr/run, var/vc/solr/logPid and log files, kept in the Velocity layout.
StartTimeout60Seconds start waits for Solr to answer.
./console exp:solr status --allow-root-user   # says how to enable it until [SolrSettings] Enabled=true

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