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

FrankenPHP

FrankenPHP für Hoster - was die produktionsreife alternative Engine ist, wie exp:velocity die Binärdatei installiert und prüft, ihr eingebettetes PHP, das keine php.ini liest, Threads, HTTPS, Logs, ihre Grenzen…

Download as PDF

Address: https://doc.exponential.earth/exphelp/viewer/help/hosting/servers/frankenphp.md

On this page

This page is a translation. Read the English original

FrankenPHP

Diese Seite ist für Systemadministratoren bei Hosting-Unternehmen, die FrankenPHP für Kunden-Websites in Betracht ziehen. Sie beantwortet: was FrankenPHP in Exponential ist, wie es installiert und geprüft wird, was sein eingebettetes PHP braucht, wie es sich mit der eigenen Engine von Velocity vergleicht und was zuerst schiefgeht. Die Quellen sind Kapitel 8, Abschnitt 8.4 und FrankenPHP als Web-Engine von Exponential.

Inhalt

  1. Was es ist
  2. FrankenPHP oder die Engine qbix von Velocity
  3. Installieren und starten
  4. Das eingebettete PHP
  5. Threads
  6. HTTPS
  7. Konfiguration, Steuerung und Logs
  8. Fehlerbehebung
  9. Checkliste

Was es ist

FrankenPHP ist der Webserver Caddy mit eingebautem PHP, als eine Binärdatei (150 bis 180 MB pro Plattform). Velocity lädt sie herunter, prüft sie und steuert sie mit denselben Befehlen wie seine anderen Engines. Sie läuft im klassischen Modus: ein Pool von PHP-Threads, jede Anfrage beginnt mit einem sauberen Zustand wie unter PHP-FPM. Der Worker-Modus von FrankenPHP wird bewusst nicht angeboten, weil der Kernel den Zustand einer Anfrage in globalen Variablen hält und eine Anfrage in die nächste durchsickern würde.

exp:frankenphp <verb> ist dasselbe wie exp:velocity <verb> --engine=frankenphp (Befehle zur Serversteuerung).

FrankenPHP oder die Engine qbix von Velocity

qbix (Velocity)frankenphp
Rollefür jede Phase empfohlenproduktionsreife Alternative
PHPdas der Maschine, 8.0 oder neuer (ab Velocity 0.0.4.54)das eigene der Binärdatei (PHP 8.5 in den offiziellen Releases 1.12)
Anfragenpersistente Workerklassischer Modus, sauberer Zustand pro Anfrage
Antwort-Cachejanoch nicht ([CacheSettings] wird ignoriert)
TLS und HTTP/2jaja
gracefulerneutes exec, Socket bleibt erhaltenNeuladen der Konfiguration, keine abgebrochene Verbindung
Konfigurationder Baum /etc/vcein erzeugtes Caddyfile
Zu pflegendes PHP der Maschine und PHP-FPMdas PHP der Maschinekeines für das Ausliefern (die Konsole nutzt weiterhin das PHP der Maschine)

Wählen Sie FrankenPHP, wenn Sie eine geprüfte Binärdatei mit TLS und HTTP/2 und eine Trennung pro Anfrage wie bei PHP-FPM wollen. Wählen Sie qbix, wenn Sie persistente Worker und den Antwort-Cache wollen (Velocity-Engines).

Installieren und starten

php bin/php/console exp:velocity config set --apply ServerSettings Engine frankenphp --allow-root-user
php bin/php/console exp:velocity install --allow-root-user          # optional: start installs it when missing
php bin/php/console exp:velocity install --check --allow-root-user  # is the pinned binary in place?
php bin/php/console exp:velocity start --allow-root-user
php bin/php/console exp:velocity status --all --allow-root-user
  • install holt das Release-Asset für diese Maschine zur [FrankenPHPSettings] Version (ausgeliefert 1.12.7) und weist es ab, wenn sein SHA-256 nicht mit der daneben festgelegten Zeile Sha256[<asset>] übereinstimmt. Die Binärdatei wird in var/vc/frankenphp/bin/ gespeichert.
  • Variant wählt den Linux-Build: gnu (Standard, kann .so-Erweiterungen laden), musl (vollständig statisch) oder mimalloc.
  • install --from=<file> installiert eine kopierte Datei auf einer Maschine ohne Zugriff auf GitHub, auf dieselbe Weise geprüft.
  • Wurde ein Release upstream neu erstellt und passt der Pin nicht mehr, scheitert die Installation mit einem Unterschied im SHA-256. Die Quellseite beschreibt, wie Sie den veröffentlichten Digest prüfen und den Pin in einer Überschreibung setzen (FrankenPHP, Abschnitt 2.4). Schalten Sie die Prüfung nie aus, um eine Installation durchzubringen.

Ausgelieferte Ports: 8089 für HTTP und 8444 für HTTPS ([FrankenPHPSettings] Port, HTTPSPort), sodass es für Tests neben der Engine qbix laufen kann.

Das eingebettete PHP

Die Binärdatei liest keine php.ini der Maschine. Alles, was die php.ini der Maschine liefern würde, muss als Zeilen IniOptions[] angegeben werden, in dieser Reihenfolge (das Spätere gewinnt): [PHPSettings] IniOptions[] (mit qbix geteilt), dann [FrankenPHPSettings] IniOptions[]. Oder [FrankenPHPSettings] PHPIniFile nennt eine eigene php.ini.

Ausgelieferte [FrankenPHPSettings] IniOptions[]: display_errors=Off, log_errors=On, memory_limit=512M, opcache.enable=1, post_max_size=64M, upload_max_filesize=32M. Die Abstimmung von OPcache kommt aus [PHPSettings].

Warnung Die Falle, der Hoster zuerst begegnen: Mit [DatabaseSettings] Server=localhost verbinden sich die Treiber für MariaDB und MySQL über einen Socket, dessen Pfad normalerweise aus der php.ini kommt. Das eingebettete PHP hat keine, die Verbindung scheitert, und die Website zeigt An unexpected error has occurred. Setzen Sie den Socket ausdrücklich, oder verbinden Sie sich über TCP mit Server=127.0.0.1 (FrankenPHP, Abschnitt 6.1).

# settings/override/velocity.ini.append.php
[PHPSettings]
IniOptions[]=mysqli.default_socket=/var/lib/mysql/mysql.sock
IniOptions[]=pdo_mysql.default_socket=/var/lib/mysql/mysql.sock

Den echten Pfad finden Sie mit php -i | grep -i "default_socket". Dasselbe gilt für jeden anderen Wert, den eine php.ini liefert: eine Zeitzone, sendmail_path, open_basedir, session.save_path, die Konfiguration einer Erweiterung. Wenn etwas unter Apache funktioniert, aber nicht unter FrankenPHP, vermuten Sie einen Wert der php.ini, den das eingebettete PHP nie gesehen hat.

Die Binärdatei bringt eine breite Auswahl an Erweiterungen mit, aber nicht unbedingt jede, die eine Website braucht. Auf der Variante gnu kann eine fehlende Erweiterung als IniOptions[]=extension=/path/ext.so geladen werden, wenn sie zur PHP-Version der Binärdatei passt; sonst ist ein eigener Build nötig.

Threads

[FrankenPHPSettings] Workers ist die Anzahl der PHP-Threads; leer bedeutet den Standard von FrankenPHP, das Doppelte der CPU-Kerne. SpareWorkers fügt unter Last Threads hinzu. Diese fallen nicht auf [ServerSettings] zurück. Gemessen auf einer Testinstallation mit 12 Kernen waren mehr Threads als das unter hoher Last langsamer: Bei 64 gleichzeitigen Anfragen schafften 12 bis 48 Threads etwa 10 % mehr Arbeit als 96 oder 590, mit bis zu 24 % weniger CPU pro Seite (FrankenPHP, Threads). Setzen Sie Workers erst ausdrücklich, nachdem Sie Ihre eigenen Seiten gemessen haben.

FrankenPHP ist ein Go-Programm; GOMEMLIMIT und GOMAXPROCS sind Umgebungsvariablen des Prozesses, der exp:velocity start ausführt, keine Konfiguration von Caddy.

HTTPS

Standardmäßig an (HTTPS=enabled) auf HTTPSPort neben HTTP auf Port. Es nutzt [HTTPSSettings] Certificate und Key, wenn beide gesetzt sind; sind beide leer, erstellt es ein selbstsigniertes Zertifikat in var/vc/frankenphp/tls/ (ein Jahr gültig, einen Monat vor Ablauf erneuert). Eine öffentliche Website nennt ihr Zertifikat; führen Sie nach dem Ersetzen der Dateien exp:velocity graceful aus. ACME wird für diese Engine nicht verwaltet: exp:velocity ssl gehört zur Engine qbix und verweigert hier, und das erzeugte Caddyfile setzt auto_https off.

Konfiguration, Steuerung und Logs

WasWo
Erzeugtes Caddyfilevar/vc/frankenphp/run/Caddyfile, bei jedem start, graceful und restart neu erzeugt und geprüft; nie bearbeiten
Ihre eigenen Caddy-Direktiveneine Datei, die [FrankenPHPSettings] SiteInclude nennt
Admin-APISocket nur für den Eigentümer, var/vc/frankenphp/run/admin.sock; stop und graceful nutzen ihn
Logsvar/vc/frankenphp/log/access.log und error.log, im JSON-Format von Caddy
Kompression[FrankenPHPSettings] Compression (zstd br gzip) oder disabled
php bin/php/console exp:velocity ctl caddyfile --engine=frankenphp --allow-root-user   # print what would be generated
php bin/php/console exp:velocity ctl validate  --engine=frankenphp --allow-root-user
php bin/php/console exp:velocity ctl version   --engine=frankenphp --allow-root-user

Fehlerbehebung

SymptomUrsacheAbhilfe
SHA-256 mismatch ... expected ... got ... bei der Installationder Pin ist veraltet, oder Asset oder Variante sind falschden veröffentlichten Digest prüfen, den Pin setzen, install --force
Datenbankverbindung scheitert, An unexpected error has occurred.kein Socket für MariaDB oder MySQL im eingebetteten PHPdie Zeilen IniOptions[] für den Socket oder Server=127.0.0.1
Port von außen nicht erreichbarFirewall geschlossen, oder Host an Loopback gebundenden Port öffnen; Host setzen
Zertifikatswarnung im Browserdas selbstsignierte Zertifikat ist in Gebrauchein echtes Zertifikat in [HTTPSSettings] nennen
graceful meldet reload rejecteddas neue Caddyfile (meist SiteInclude) ist ungültigkorrigieren; die laufende Konfiguration blieb erhalten
funktioniert unter Apache, hier 500ein Wert der php.ini, den das eingebettete PHP nie gesehen hatals IniOptions[] hinzufügen oder PHPIniFile nutzen

Checkliste

  • To do: Binärdatei installiert und geprüft (install --check); der Pin passt.
  • To do: Datenbank-Socket oder TCP-Verbindung für das eingebettete PHP gesetzt; die Website antwortet.
  • To do: Jeder Wert der php.ini, von dem die Website abhängt, als IniOptions[] oder über PHPIniFile angegeben.
  • To do: Ein CA-Zertifikat in [HTTPSSettings] genannt, von Ihrem Werkzeug erneuert, gefolgt von graceful.
  • To do: Workers auf dem Standard belassen oder aus einer Messung gesetzt.
  • To do: Tarife, die auf den Antwort-Cache angewiesen sind, nutzen stattdessen qbix.

Demomodus unter FrankenPHP. Setzen Sie EXP_DEMO_MODE=1 in der Umgebung des FrankenPHP-Prozesses (seiner Unit oder der Umgebung, mit der Velocity ihn startet), und zwar nur für eine öffentliche Demo. Demomodus für Hoster.

Verwandte Seiten

Werden Sie Exponential-Partner

Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.

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