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

Architecture overview

The layers of an Exponential installation and what each is responsible for - servers, the kernel entry points, the domain classes, the libraries, the presentation layer, extensions, settings and var/ - with the…

Download as PDF

Address: https://doc.exponential.earth/exphelp/viewer/help/software-engineers/architecture-overview.md

On this page

Architecture overview

This page is the engineer's map of an Exponential installation: which layer does what, where it lives on disk, and which architectural decisions shape everything else. The authoritative description, with a rule for each building block, is Kernel architecture; this page summarizes it and adds the reasoning.

Contents

  1. The layers
  2. The directory layout
  3. Five architectural decisions
  4. Where state lives
  5. What the architecture does not have

The layers

 Browser / CLI / cron
        |
 Server: Apache or nginx + PHP-FPM  |  Velocity (qbix)  |  FrankenPHP
        |
 Entry points: index.php  /  bin/php/console  /  runcronjobs.php
        |
 Kernel: ezpKernel -> ezpKernelWeb   settings -> extensions -> siteaccess -> session -> module
        |
 Modules and views: eZModule::run() -> view class  (kernel/<module>/, extensions)
        |
 Domain: kernel/classes  (content, users, roles, datatypes, workflows, caches)
        |
 Libraries: lib/ezdb (eZDB), lib/eztemplate (eZTemplate), lib/ezutils (eZINI, eZSys, ...)
LayerResponsibilityMain classes
ServerAccept the connection, serve static files, run PHPVelocity, PHP-FPM, FrankenPHP (Application servers)
Entry pointsStart the right kernel for web, console or cronindex.php, bin/php/console, runcronjobs.php, eZScript
KernelSettings, extensions, siteaccess, session, dispatchezpKernel, ezpKernelWeb, eZSiteAccess, eZExtension
Modules and viewsURL namespaces and pages, permission checkseZModule, Exponential\Runnable\ModuleView
DomainContent, users, roles, datatypes, workflows, notifications, cacheseZContentObject, eZContentObjectTreeNode, eZUser, eZRole, eZDataType, eZCache
LibrariesDatabase, templates, settings, files, locale, maileZDB, eZTemplate, eZINI, eZClusterFileHandler, eZLocale
PresentationTemplates, designs, overridesdesign/<design>/templates, override.ini
ExtensionsEverything an installation addsextension/<name>/

The directory layout

From the installation book (1.2 The parts of an installation):

kernel/, lib/      the kernel: modules, classes, the template engine, the database layer
autoload/          the kernel's class map (autoload/ezp_kernel.php)
extension/         extensions: your application lives here
design/            designs: templates, stylesheets, images
settings/          shipped settings; settings/siteaccess/ and settings/override/ hold yours
var/               runtime: caches, logs, storage, the SQLite database
bin/php/console    one entry point for every command
cronjobs/          the scripts runcronjobs.php runs
index.php          the front controller

Five architectural decisions

  1. One front controller, one dispatch loop. Every web request goes through index.php and ezpKernelWeb::run(); there is no second web entry point for normal pages. Special entry points exist for REST (index_rest.php), the tree menu (index_treemenu.php) and clustered file serving (index_cluster.php).
  2. The siteaccess is the unit of configuration. A siteaccess is a named configuration selected per request (a site, the administration, a language); most behavior differences are settings, not code (Siteaccesses and configuration).
  3. Everything pluggable is named in settings. Modules, datatypes, workflow events, template operators, cronjob parts, notification handlers, login handlers and cluster file handlers are found through INI lists, so an extension plugs in by shipping a class and an .ini.append.php file (Events, extension points and plugins).
  4. A runtime-defined content model. Content classes are data, not code: administrators add classes and attributes without a deployment, and datatypes give each attribute storage, validation and templates (The content model for engineers).
  5. All cache files through the cluster file handler. Caches are written through eZClusterFileHandler, so the same code runs on one disk or on shared storage for several web nodes (Scaling and clustering).

Where state lives

StateWhereShared between web nodes
Content, users, roles, URL aliasesthe databaseyes
Uploaded files and image variationsvar/<site>/storage (or the cluster backend)must be
Cachesvar/<site>/cache, or Redis or Valkey with sevenx_valkey_cachedepends on the cache (Caching layers for engineers)
SessionsPHP's session storage, or the ezsession table with ezpSessionHandlerDBmust be, for several nodes
Logs and audit recordsvar/log, var/<site>/logper node unless collected
Settingssettings/, extension settings/deployed with the code

What the architecture does not have

  • No dependency injection container of its own. Classes are found through the class map and settings; singletons such as eZINI::instance() and eZDB::instance() are the norm. When the kernel runs inside Symfony, ezpKernel::hasServiceContainer() and getServiceContainer() give access to Symfony's container.
  • Upgrade steps and migrations, from the console. Kernel and extension database updates are upgrade steps that exp:upgrade applies and records; a site's own changes are migrations that exp:migration:migrate runs in order and records in exp_migration (Schema changes and migrations, Migrations).
  • No message broker in the kernel. Background work runs as cronjob parts, content jobs and the expqueue extension (Console, cronjobs and background work).
  • No Symfony in the kernel. The Symfony platform products embed the kernel through the legacy bridge (Symfony and the legacy bridge).

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