Eine PHP-Entwicklungsumgebung für Symfony mit Windows und WSL2

Eine konsistente API und eine vollständige Dokumentation sind die Basis für eine gute Developer Experience. Die dritte Säule ist die Entwicklungsumgebung. Ein schnell einzurichtender Softwarestack senkt die Einstiegshürde, sich mit einem System zu beschäftigen. Darüber hinaus gewährleistet eine stabile Entwicklungsumgebung langfristig eine produktive und fokussierte Arbeitsweise. Entwickler sollten entwickeln und nicht den "Yak rasieren" müssen (Yak Shaving).

Wahrscheinlich verdankt PHP seine Popularität der Erfahrung der Entwickler. Und der einfache Code-Refresh-Code-Zyklus ist bis heute überzeugend. Allerdings war für mich die LAMP (Linux, Apache, MySQL, PHP)-Entwicklungserfahrung unter Windows immer etwas dürftig. Im Laufe der Jahre gab es eine Reihe von Bemühungen, dies zu verbessern: WAMP, Vagrant, Docker... die Liste geht weiter und weiter.

Obwohl diese Bemühungen PHP-Entwicklung auf dem populärsten Desktop-Betriebssystem ermöglicht haben, fühlte es sich immer "unnatürlich" an auf Windows zu arbeiten. Und wenn der fertige Code produktiv auf einer Linux-Umgebung läuft, verhält sich die Anwendung vielleicht etwas anders - es bleibt immer eine Unsicherheit. Im Vergleich zu MacOS mit seinen BSD- Unterstützungen kommt Windows einfach aus einer anderen Welt als der Unix-Bereich, aus dem PHP stammt.

WSL2 bringt einen echten Linux-Kernel in die Windows Welt

Microsoft hat erkannt, dass die überwiegende Mehrheit der Open-Source-Entwicklungsprojekte (einschließlich PHP) auf von Unix abgeleiteten Betriebssystemen basiert, wobei GNU/Linux das beliebteste ist. Im August 2016 veröffentlichte Microsoft das Windows 10 Jubiläums-Update mit einer neuartigen Technologie, die die Entwicklung und Ausführung von Linux-Anwendungen ermöglicht: das Windows Subsystem for Linux (WSL)

WSL ist eine Übersetzungsschicht, die den Betrieb einer Linux-kompatiblen Shell ermöglicht, indem sie Systemaufrufe vom Linux-Kernel in ihre Windows-Kernel-Äquivalente übersetzt. Diese Technologie wurde umgekehrt verwendet, um Microsoft zu ermöglichen, sein Datenbankprodukt MS SQL Server zusätzlich zu Windows Server auch auf dem Betriebssystem Linux laufen zu lassen. Zusätzlich zur Übersetzung von Systemaufrufen implementiert WSL auch eine Dateisystem-Kompatibilitätsschicht, die die gemeinsame Nutzung von Dateien zwischen der Windows-Shell und WSL-Terminals ermöglicht.

In den Jahren nach ihrer Veröffentlichung wurde WSL verbessert und einige Hauptprobleme wie langsamer Festplattenzugriff wurden angegangen. Aber letzlich entschied das Team, das System von Grund auf neu zu bauen. Im Mai 2019 kündigte Microsoft an, dass WSL von der WSL2 abgelöst werden würde. Die zweite Iteration der Technologie läuft auf einem nativen Linux-Kernel auf Hyper-V, der von Microsoft vollständig unterstützt wird. Schwer vorstellbar für diejenigen unter uns, die sich an die Zeit erinnern, als der CEO von Microsoft Linux als Krebsgeschwür bezeichnete.

Jetzt - ein Jahr nach der Ankündigung - ist WSL2 "ready for Primetime". Microsoft plant, WSL2 mit dem Windows 10 2020 Mai Update (auch bekannt als Windows 10 2004 [sic!]) zu veröffentlichen. In der Tat, Microsoft performt immer noch bescheiden in Sachen Namensfindung, aber ihre jüngsten technischen Bemühungen sind beeindruckend. WSL2 wird als optionales Paket mit einem voraussichtlichen Veröffentlichungsdatum in der letzten Maiwoche ausgeliefert.

eZ Platform auf WSL2 installieren

Während die offizielle Veröffentlichung noch einige Wochen entfernt ist, können Enthusiasten die WSL2 bereits ausgiebig testen, indem sie ein Insider-Build installieren. Dieses steht kurz vor der Fertigstellung und wird gerade getestet und validiert. Die Installation eines Stacks zur Ausführung von eZ Platform (oder einer beliebigen Symfony 5- Anwendung) auf WSL2 umfasst diese Schritte:

  • WSL2 aktivieren
  • Installation einer Linux-Distribution
  • System Software installieren (PHP, MariaDB, Composer, etc.)
  • Symfony CLI installieren
  • Die Anwendung installieren (z.B. eZ Platform v3.0.3)
  • Entwickeln auf und mit der App 🎉  !

WSL2 und die Virtual Machine Platform aktivieren

Der erste Schritt besteht darin, das Windows-Subsystem für Linux (WSL2) und die Virtual Machine Platform zu aktivieren. Starten Sie Windows PowerShell als Administrator und führen Sie die folgenden Befehle aus

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

Sobald dies abgeschlossen ist, verfügen Sie über die Infrastruktur, um eine eingebettete Linux Umgebung zu betreiben.

Installation einer Linux-Distribution

Wenn Sie die Eingabeaufforderung (command.exe) öffnen und "wsl" eingeben, erhalten Sie den folgenden Hinweis:

PS C:\Users\LattePanda> wsl
Windows Subsystem for Linux has no installed distributions.
Distributions can be installed by visiting the Microsoft Store:
https://aka.ms/wslstore
PS C:\Users\LattePanda>

Dies weist darauf hin, dass eine Linux-Distribution installiert werden muss. Bevor wir dies tun, müssen wir zunächst die Standard-WSL-Version auf 2 setzen. WSL1 wird weiter unterstützt, aber wir wollen auf jeden Fall WSL2 verwenden:

C:\Users\LattePanda>wsl --set-default-version 2
For information on key differences with WSL 2 please visit https://aka.ms/wsl2

Die Installation erfolgt über den Windows Store: https://aka.ms/wslstore. Im Store können Sie aus einer Reihe von verschiedenen verfügbaren Linux-Distributionen wählen. In unserem Fall wählen wir Ubuntu 20.04 LTS wegen des Long Term Supports und aufgrund der sehr aktuellen Standard- Systempakete.

Ubuntu 20.04 wird mit PHP 7.4 ausgeliefert. In diesem Artikel wird eZ Platform v3.0 installiert - die unter PHP 7.4 läuft. Für frühere Versionen von eZ Platform können Sie alternativ Ubuntu 18.04 LTS mit einer älteren Standard-PHP-Version nutzen. Ebenso können Sie eine kompatible Version komplett manuell installieren.

Sobald Sie das Paket heruntergeladen haben, fragt Sie der Installationsassistent nach einem Benutzernamen und einem Passwort. Diese werden ausschließlich für die eingebettete Linux-Instanz innerhalb Ihrer Windows 10 Installation verwendet. Wenn Sie schon einmal im Windows Store sind, empfehle ich das neue Windows-Terminal gleich mit zu installieren.

Nach der Installation können Sie vom Windows-Terminal aus überprüfen, ob ihre WSL2 Distribution läuft

PS C:\Users\LattePanda> wsl --list --verbose
  NAME            STATE           VERSION
* Ubuntu-20.04    Running         2
PS C:\Users\LattePanda>

Systemsoftware installieren

Sobald Sie eine Distribution installiert haben, werden Sie deren Standard Tools zur Verwaltung von Systempaketen und Updates verwenden. Im Falle von Ubuntu und anderen Debian-Derivaten werden Sie [APT:https://wiki.debian.org/Apt] verwenden.

HINWEIS: Zum Zeitpunkt dieses Schreibens wurde ein Known Bug im Zusammenhang mit der Echtzeituhr bei Ubuntu 20.04 und WSL2 bekannt. Um zu verhindern, dass dieser Fehler auftaucht, konfigurieren wir APT so, dass unsere installierte libc6-Version auf die Version aus der Originaldistribution eingefroren wird. Dies geschieht wie folgt:

sudo apt-mark hold libc6

Sobald dies geschehen ist, nutzen für zunächst APT zur Aktualisierung der installierten Pakete:

sudo apt update
sudo apt upgrade

Als nächstes wollen wir die Basis Paket installieren, die Notwendig sind um eZ Plattform (und viele andere Symfony- Anwendungen) auszuführen:

sudo apt install composer php-xml php-intl php-gd php-curl php-fpm

Ich habe absichtlich den Datenbankdienst von oben weggelassen, um zu veranschaulichen, dass eZ Platform sowohl mit MySQL/MariaDB- als auch mit PostgreSQL-Datenbanken kompatibel ist. Wählen Sie die für Ihre Bedürfnisse geeignete Datenbank aus. Ich habe mich für die Verwendung von MariaDB für dieses Tutorial entschieden. Installieren Sie den MariaDB-Server und die PHP-MySQL Erweiterung:

sudo apt install mariadb-server php-mysql

Anschließend starten Sie die MariaDB-Serverinstanz und melden sich als Root-Benutzer an:

sudo service mysql start
sudo mysql

Um eine Datenbank für eZ Plattform hinzuzufügen, führen Sie die folgenden SQL-Anweisungen aus:

CREATE DATABASE ezp;
GRANT ALL ON ezp.* TO 'ezp'@'localhost' IDENTIFIED BY 'wsl2ezp';
FLUSH PRIVILEGES;
EXIT;

Überprüfen Sie schließlich, ob Sie auf die Datenbank zugreifen können:

mysql -uezp -pwsl2ezp ezp

Eine Linux-Umgebung mit PHP, MariaDB und dem Composer Paketmanager ist jetzt einsatzbereit:

janit@W1ND0Z1337:~$ php -version
PHP 7.4.3 (cli) (built: May  5 2020 12:14:27) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies
janit@W1ND0Z1337:~$ composer --version
Composer 1.10.1 2020-03-13 20:34:27
janit@W1ND0Z1337:~$ mysql --version
mysql  Ver 15.1 Distrib 10.3.22-MariaDB,
       for debian-linux-gnu (x86_64) using readline 5.2

Da wir Symfony Encore für das Front-End-Asset- Management verwenden, werden wir den Yarn Paketmanager aus dem Projekt- Repository installieren. Dieser wird auch Node.js als Abhängigkeit installieren:

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update
sudo apt install yarn

Symfony CLI installieren

Der aufmerksame Leser hat vielleicht bemerkt, dass das A in LAMP und das E in LEMP bei der obigen Installationsprozedur fehlt! Anders gesagt: auf unserem Stack ist bisher kein Webserver installiert. Traditionell enthält ein PHP-Stack einen separaten Webserver. Ein vollwertiger HTTP-Server ist immer noch erste Wahl für eine Produktions Umgebeung, für die Entwicklung habe ich mich für eine einfachere Option entschieden: den Symfony Local Web Server.

Das Symfony CLI ist eine eigenständige Kommandozeilen Anwendung, die Sie von Ihrem WSL-Terminal aus installieren können. Denken Sie bei der Installation daran, die Linux-Anweisungen auf der Symfony Website zu befolgen, NICHT die Windows Anweisungen:

wget https://get.symfony.com/cli/installer -O - | bash

Die obige Installation installiert das Symfony CLI in Ihrem Benutzerverzeichnis, aber Sie können es global verfügbar machen, indem Sie es verschieben:

sudo mv /home/janit/.symfony/bin/symfony /usr/local/bin/symfony

Wir können jetzt unseren Symfony Stack testen, indem wir eine 'hello world' app anlegen und den Webserver starten:

symfony new hello-world
cd hello-world
symfony serve

Öffnen Sie ein Browser Fenster und rufen die App über http://localhost:8000 auf. Wenn Sie den Befehl erstmals ausführen, wird Windows fragen, ob der Datenverkehr zulässig ist.

Sie sollten nun - wie im folgenden Screenshot - eine minimale Symfony App sehen, die auf WSL2 unter Windows läuft:

Mehr Details zur Einrichtung von TLS, paralleler Nutzung von mehreren PHP-Versionen usw. finden Sie in der Symfony Dokumentation.

Installieren der Anwendung

Als nächstes steht die Installation und Ausführung einer Symfony-Anwendung an. Dies funktioniert wie in jeder Linux Umgebung (weil es eine ist - eine echte Linux Umgebung auf Ihrem Windows System!). Wir werden ́mit Hilfe vom Composer ein eZ Platform Projekt anlegen. Im Hintergrund clont Composer das Meta-Repository, checkt ein Release aus und installiert alle Notwendigen Pakete:

composer create-project ezsystems/ezplatform ezplatform ^3
cd ezplatform

Um die Datenbank anzulegen und initial zu füllen, müssen wir zunächst die Datenbanverbindung konfigurieren und anschließend die Installation abschließen.

echo "DATABASE_URL=mysql://ezp:wsl2ezp@127.0.0.1:3306/ezp?serverVersion=10.3" > .env.local
composer run-script ezplatform-install

Sobald dies abgeschlossen ist, können Sie im Projektverzeichnis den Symfony Webserver starten:

symfony serve

Die Ausgabe zeigt, dass der Symfony-Webserver die installierte Version von PHP- FPM erkennt und auch verwendet:

May 11 21:11:40 |DEBUG| PHP    Reloading PHP versions
May 11 21:11:40 |DEBUG| PHP    Using PHP version 7.4.3 (from default version in $PATH)
May 11 21:11:40 |INFO | PHP    listening path="/usr/sbin/php-fpm7.4" php="7.4.3" port=38257
May 11 21:11:40 |DEBUG| PHP    started
May 11 21:11:40 |INFO | PHP    'user' directive is ignored when FPM is not running as root
May 11 21:11:40 |INFO | PHP    'group' directive is ignored when FPM is not running as root
May 11 21:11:40 |INFO | PHP    fpm is running, pid 15263
May 11 21:11:40 |INFO | PHP    ready to handle connections
May 11 21:11:40 |INFO | PHP    systemd monitor interval set to 10000ms

 [OK] Web server listening
      The Web server is using PHP FPM 7.4.3

      http://127.0.0.1:8000

Wenn Sie nun einen Browser (in Windows) öffnen und auf http://localhost:8000/ gehen, können Sie sehen, dass die Anwendung läuft. Um von Windows aus auf die Dateien zuzugreifen, können Sie den folgenden Befehl ausführen, um ein Windows-Explorer- Fenster in Ihrem aktuellen Arbeitsverzeichnis zu öffnen:

explorer.exe .

Von hier aus können Sie durch das komplette Projekt navigieren und alle Windows-IDEs (oder sogar notepad.exe!) verwenden, die Sie für die Entwicklung verwenden möchten. Wenn Sie von Windows-Tools aus auf die MariaDB-Datenbank zugreifen möchten, lesen Sie unbedingt diesen Blog-Beitrag über die Verbindung zu einer MySQL DB vom Windows-Host mit der WSL2.

Alles Schritte des Installationsprozesses können Sie In diesem Video verfolgen:

Fazit

Das ursprüngliche WSL hat Windows bereits näher an das PHP-Ökosystem herangeführt, aber es mangelte in einigen Bereichen an Leistung und Kompatibilität. WSL2 ist ein neuer Ansatz für die gleiche Aufgabe (Ausführen von Linux-Anwendungen unter Windows), der dazu beitragen soll, die bisherigen Probleme zu beheben. Es wird sich zeigen ob und an welchen Stellen WSL2 an seine Grenzen stößt oder versagt - aber es ist definitiv ein sehr guter Anfang.

Es ist auch erwähnenswert, dass dieses Tutorial sich zwar auf die Erstellung einer minimalen Entwicklungsumgebung konzentriert, viele Projekte in der realen Welt jedoch komplizierter sind. Sie haben Abhängigkeiten zu zusätzlichen Daemons wie ElasticSearch, Redis, RabbitMQ und vielleicht zu einer Reihe von Microservices.

Als "Sahnehäubchen" müssen viele von uns gleichzeitig an mehreren derartig komplexen Projektaufbauten arbeiten. Für diese Fälle sind Werkzeuge wie Docker und Kubernetes eine gute Wahl. Änderungen in WSL2 machen es möglich, diese Arbeiten auch unter Windows besser als bisher auszuführen.

P.S.: Jetzt, wo Sie eZ Platform von Ibexa in Ihrer lokalen Umgebung installiert haben, warum erfahren Sie nicht mehr darüber, was eZ Platform für Entwickler bietet und drehen mit uns eine Runde? :)

Insights and news