PHP unter macOS Monterey

Mit macOS Monterey hat Apple den integrierten PHP Support aufgegeben. Der Verlust ist verschmerzbar, weil es eine komfortable Lösung gibt - Docker vorausgesetzt.

Mein letztes Upgrade auf macOS Monterey hat mir wirder ins Gedächtnis geholt, wie naiv ich bisher bei der Wahl meiner präferierten Platform war. Apple zeigt mir mit dem Wegfall von PHP einmal mehr, dass man sich auf die dauerhafte Integration fremder Frameworks und Tools unter macOS nicht allzu verlassen sollte.

Mit macOS Monterey ist das integrierte PHP Geschichte, und der Weiterentwicklung meiner bisherigen Webseiten, die davon abhängen, geraten ins Stocken.

Zuvor startete ich meinen Server mit folgendem Kommando:

php -S 0.0.0.0:8080 -t src/php -n

Seit Monterey kennt macOS die php Binary aber nicht mehr. Es erscheint ein Fehler:

bash: php: command not found

Glücklicherweise habe ich schon seit etlicher Zeit Docker Desktop installiert - neuerdings Docker Personal, da auch die Docker Inc. offenbar monetäre Pläne mit der Containerisierung hegt und entsprechend ihre Produktpalette in Business und Personal unterteilt. Wie auch immer, mittels Docker lässt sich ein PHP Server weiterhin mit nur einer einzigen Zeile starten, als hätte sich nichts geändert.

Die Idee ist, PHP in einem Container zu laden und diesen dann in die Lage versetzen meinen bisherigen Code zu kompilieren.

docker run -it --rm --name php-container \
  -p 8080:80 -P \
  -v "$PWD/src/php":/usr/src/myapp \
  -w /usr/src/myapp \
  php:7.4-cli php -S 0.0.0.0:80 -n

Es klappt einwandfrei und ohne murren.

Funktionsweise:

docker run instantiiert das Image php:7.4-cli als Container mit dem Namen php-container. Es wird ein integriertes Terminal (--it) verwendet, und nach Beendigung automatisch entfernt (--rm). Der Container erhält die Anweisung php mit auf der Adresse 0.0.0.0:80 im Serverbetrieb (-n) zu starten. Dazu verwendet wechselt er ins interne Workdirectory /usr/src/myapp und mappt dieses mit dem außen liegenden aktuellen Pfad $PWD/src/php. Dieses Mapping wird per Volume link gelöst (-v). Um den internen Container-Port 80 zu erreichen, wird dieser auf den Port des hosts 8080 umgeleitet. Mögliche weitere zugänglich gemachte aber ungenutzte Ports werden beliebig zugeordnet -P.

Nun kann die Weiterentwicklung meiner Webseiten voranschreiten.