Verwaltung und Bereitstellung von PHP-Workern
Ein "PHP-Worker" in diesem Kontext ist eine PHP-Anwendung, die nicht von einem Webserver wie Apache bereitgestellt wird. Stattdessen handelt es sich um eine eigenständige PHP-Anwendung, die im Hintergrund läuft und entweder:
- Aufgaben wie das Verarbeiten von Nachrichten aus einer Warteschlange oder das Bearbeiten von Hintergrundprozessen übernimmt.
- Einen eigenen Webserver mitbringt, um HTTP-Anfragen zu bedienen.
Starten eines PHP-Workers
- mStudio UI
- CLI
- API
Um einen PHP-Worker über das mStudio zu starten, befolge diese Schritte:
- Navigiere zu dem Projekt, in dem du die Anwendung erstellen möchtest.
- Wähle im Seitenmenü den Menüpunkt „Apps“ aus.
- Klicke auf die Schaltfläche „App erstellen“ und wähle „PHP-Worker“.
- Wähle im Installationsassistenten den Entrypoint-Befehl aus, mit dem deine Anwendung gestartet werden soll, und schließe den Assistenten ab.
Nach Abschluss der Installation kannst du das Installationsverzeichnis in der UI einsehen.
Um eine PHP-Anwendung über die CLI zu starten, führe folgenden Befehl aus:
$ mw app create php-worker --wait --entrypoint "php server.php"
Die Option --wait
sorgt dafür, dass die CLI wartet, bis die Installation abgeschlossen ist. Die Option --entrypoint
legt den angegebenen Entrypoint-Befehl als Startbefehl für deine Anwendung fest. Falls diese Option weggelassen wird, wird standardmäßig php server.php
als Entrypoint verwendet.
Nach Abschluss der Installation kannst du das Installationsverzeichnis mit dem Befehl mw app get
einsehen.
Um zu erfahren, wie du eine PHP-Anwendung über die API bereitstellst, lies den Artikel "Starten einer PHP-Anwendung".
Bereitstellung deiner Anwendung
Nachdem du deinen PHP-Worker erstellt hast, kannst du deinen Code bereitstellen, indem du ihn in das vorgesehene Anwendungsverzeichnis verschiebst. Du kannst dazu jede bevorzugte Methode nutzen, z. B. ein lokales Git-Repository, rsync
oder SFTP.
Schau dir unsere Sammlung von Bereitstellungsanleitungen an, um mehr über die Bereitstellung deines Codes zu erfahren.
Deine Anwendung über HTTP zugänglich machen
Lies unseren Leitfaden zu Webservern, um zu erfahren, wie du deinen PHP-Worker über HTTP erreichbar machst.
Verwaltung des Prozesslebenszyklus
Lies unseren Leitfaden zu Webservern, um zu erfahren, wie du den Prozesslebenszyklus deines PHP-Workers verwalten kannst.
Beispielanwendungen
ReactPHP
Die folgenden Code-Snippets zeigen ein minimales Beispiel einer ReactPHP-Anwendung, die auf dem Port lauscht, der in der Umgebungsvariable PORT
definiert ist.
Beginne mit der Erstellung einer PHP-Worker-App, zum Beispiel über die CLI:
$ mw app create php-worker --wait --entrypoint "php server.php"
Nach der Installation initialisiere ein neues Composer-Projekt im Wurzelverzeichnis der Anwendung und installiere ReactPHP als Abhängigkeit.
Alternativ kannst du mit einem lokalen Projekt starten und es dann in das Anwendungsverzeichnis deployen.
$ composer init --require=react/http --require=react/socket
Erstelle anschließend eine server.php
mit folgendem Inhalt:
<?php
require __DIR__ . '/../vendor/autoload.php';
$http = new React\Http\HttpServer(function (Psr\Http\Message\ServerRequestInterface $request) {
return React\Http\Message\Response::plaintext(
"Hallo Welt!\n"
);
});
$PORT = getenv('PORT');
if($PORT === false) {
throw new Exception("PORT-Umgebungsvariable nicht gesetzt");
}
$socket = new React\Socket\SocketServer('0.0.0.0:' . $PORT);
$http->listen($socket);
echo "PHP-Worker-Beispielanwendung läuft" . PHP_EOL;
Sobald du eine Domain mit deiner Anwendung verbindest, sollte der ReactPHP-Server über HTTP erreichbar sein.
Laravel Reverb
Um eine Laravel Reverb-Anwendung zu starten, erstelle einen PHP-Worker mit den folgenden Argumenten:
$ mw app create php-worker --wait --entrypoint "bash -c 'php artisan serve --port $PORT'"
Symfony Messenger
Um einen Symfony Messenger-Worker zu starten, erstelle einen PHP-Worker mit den folgenden Argumenten:
$ mw app create php-worker --wait --entrypoint "php bin/console messenger:consume async"
Weitere Tutorials
Befehle aus einem anderen Verzeichnis ausführen
Oft hast du bereits eine bestehende Anwendung (die als reguläre PHP-App läuft) und möchtest in demselben Verzeichnis einen Worker-Prozess starten.
Der Worker-Prozess wird derzeit immer aus seinem eigenen Verzeichnis gestartet, das möglicherweise nicht mit dem Verzeichnis der Hauptanwendung übereinstimmt. Um dies zu umgehen, kannst du ein kleines Shell-Skript erstellen, das das Verzeichnis wechselt, bevor es den Worker-Prozess startet. Verwende dann dieses Skript als Entrypoint:
#!/bin/bash
cd /html/actual-installation-directory
exec php artisan serve --port $PORT
Mehrere Worker-Instanzen ausführen
Manchmal möchtest du mehrere Worker-Instanzen derselben Anwendung ausführen. Während dies durch das Erstellen mehrerer PHP-Worker-Apps möglich ist, kannst du auch mehrere Worker-Instanzen innerhalb derselben PHP-Worker-App mit einem Prozessmanager wie pm2 betreiben.
Dazu füge Node.js als Abhängigkeit zu deiner PHP-Worker-App hinzu:
$ mw app dependency update <app-id> --set node=~22.0
Dann installiere PM2 über NPM:
$ npm install -g pm2
Erstelle im Anwendungsverzeichnis eine ecosystem.config.js
-Datei:
module.exports = {
apps: [
{
name: "test-app",
instances: 2,
script: "bin/console",
args: "messenger:consume async",
watch: ["src"],
interpreter: "php",
cwd: "/html/actual-installation-directory", // optional
},
],
};
Stelle sicher, dass pm2
als Entrypoint für deine PHP-Worker-App verwendet wird:
$ mw app update <app-id> --entrypoint "pm2 start ecosystem.config.js --no-daemon"