====== Lokale PHP-Entwicklungsumgebung unter macOS Monterey und Apple Silicon (Mac M1) ====== Diese Anleitung beschreibt die Einrichtung einer lokalen Web-Entwicklungsumgebung auf dem eigenen Mac. Sie beinhaltet auch die Installation von Komponenten, die für TYPO3 benötigt werden (z.B. GraphicsMagick).\\ Am Ende dieser Seite habe ich die verschiedenen [[tools:local-dev-monterey-apple-silicon#quellen|Quellen]] für diese Sammlung notiert. Im Ergebnis erhalten wir: - Vor allem: die Möglichkeit, beliebig viele Webprojekte parallel laufen zu lassen. - Einen lokalen Apache-Webserver mit PHP. - MySQL inkl. phpMyAdmin für beliebig viele Datenbanken. - Eine Verzeichnisstruktur zum komfortablen Anlegen neuer Projekte. - Image Processing, nicht nur für TYPO3 CMS. - Einfaches Testing von E-Mail-Versand und E-Mail-Templates. ===== Apple Silicon Support ===== Viele Programme waren mit dem neuen Apple M1 Chip anfangs nicht kompatibel. Sie mussten dann mit Rosetta installiert werden: ein Framework von Apple, mit dem sich Programme ausführen lassen, die für Intel-x64-Prozessoren kompiliert wurden. **Die meisten Programme unterstützen die neuen Apple Chips jetzt nativ.** * [[https://isapplesiliconready.com/|Is Apple Silicon Ready? – eine Übersicht verschiedenster Programme]] ===== 1. Xcode ===== Das Programm selbst benötigt man möglicherweise nicht, aber es bringt einige nützliche Bibliotheken und Tools mit. Xcode kann kostenlos im App Store heruntergeladen werden. Nach der Installation muss noch die Lizenz akzeptiert werden, wahlweise bei einem Programmstart oder über die Kommandozeile (''xcodebuild -license''). ---- ===== 2. Homebrew ===== [[https://brew.sh/index_de|Homebrew]] ist eine praktische Paketverwaltung, mit der viele Programme einfach auf dem Mac installiert und aktualisiert werden können. Homebrew selbst und die meisten Pakete sind inzwischen mit dem M1 Chip kompatibel, so dass wir auf Rosetta verzichten können. **Installation über das Terminal:** /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ---- ===== 3. dnsmasq ===== Mit diesem **Domain Name System** (DNS) können unsere localhost-Websites mit praktischen Domains aufgerufen werden, z.B. [[http://kunde1.test/|http://kunde1.test/]]. Die folgenden Befehle installieren das Programm, erstellen benötigte Ordner und verweisen alle Anfragen zur **.test** //Top Level Domain// zu unserem localhost. **Terminal:** brew install dnsmasq cd $(brew --prefix) mkdir etc echo 'address=/.test/127.0.0.1' > etc/dnsmasq.conf sudo cp -v $(brew --prefix dnsmasq)/homebrew.mxcl.dnsmasq.plist /Library/LaunchDaemons sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist sudo mkdir /etc/resolver sudo bash -c 'echo "nameserver 127.0.0.1" > /etc/resolver/test' ---- ===== 4. Root-Verzeichnis ===== Wo die Websites lokal gespeichert werden, bleibt jedem selbst überlassen. Ich gehe hier von einem Ordner ''/www'' innerhalb meines User-Verzeichnisses aus. Die Verzeichnisstruktur sieht folgendermaßen aus: /Users/sebkln/www/ sites/ kunde1/ assets/ *für Quelldateien und andere Dokumente* wwwroot/ *beinhaltet die eigentliche Website* kunde2/ assets/ wwwroot/ index.php typo3/ typo3_src/ [etc] phpmyadmin/ *wird weiter unten eingerichtet* Der Name ''wwwroot'' ist frei gewählt. Das Verzeichnis könnte auch ''htdocs'', ''html'' oder ''public'' genannt werden. Du kannst Verzeichnisnamen oder Strukturen abweichend anlegen, musst dies dann nur konsequent in allen Code-Beispielen dieser Anleitung durchziehen (z.B. in der ''httpd-vhosts.conf''). ---- ===== 5. PHP ===== Mit macOS Monterey liefert Apple erstmals keine PHP-Version mehr mit. Es war aber schon vorher ratsam, PHP über Homebrew zu installieren. Ich installiere gleich mehrere PHP-Versionen, zwischen denen man später bei Bedarf wechseln kann. **Terminal:** brew install php brew install php@7.4 brew install php@7.2 Das PHP-Paket ohne Suffix beinhaltet jeweils die aktuelle PHP-Version (derzeit PHP 8.0). ==== PHP.ini ==== Speicherort: ''/opt/homebrew/etc/php/7.4/php.ini'' (bzw. entsprechende Versionsnummer) Zentrale Konfigurationsdatei für PHP. Folgende Anpassungen sind empfohlen, besonders in Hinblick auf die Verwendung von TYPO3: max_execution_time = 240 always_populate_raw_post_data = -1 max_input_vars = 1500 upload_max_filesize = 10M post_max_size = 10M Um bei der täglichen Arbeit später die PHP-Versionen zu wechseln, sind zwei Dinge notwendig: - Die PHP-Version über das Terminal verlinken: ''brew unlink php && brew link --force --overwrite php@7.4'' - Das PHP-Modul in der ''httpd.conf'' mit ''LoadModule'' laden (siehe den folgenden Abschnitt) und den Webserver neustarten. ---- ===== 6. Apache HTTP Server ===== macOS Monterey beinhaltet immer noch einen Apache. Da es hiermit aber Probleme geben kann, ist eine Installation per Homebrew dringend empfohlen. **Terminal:** brew install httpd brew services start httpd ==== httpd.conf ==== Speicherort: ''/opt/homebrew/etc/httpd/httpd.conf'' Die Apache-Konfigurationsdatei. Folgende Zeilen müssen mit ''#'' auskommentiert werden: AllowOverride none Require all denied Diese Zeilen müssen aktiviert oder ergänzt werden: LoadModule vhost_alias_module lib/httpd/modules/mod_vhost_alias.so Include /opt/homebrew/etc/httpd/extra/httpd-vhosts.conf Mit den folgenden Zeilen ergänzen wir die verschiedenen PHP-Versionen. Nur die aktive PHP-Version sollte aktiv sein, der Rest wird auskommentiert (bis er benötigt wird).\\ Beachte auch die abweichende Schreibweise bei PHP 8.0. #LoadModule php7_module /opt/homebrew/opt/php@7.2/lib/httpd/modules/libphp7.so LoadModule php7_module /opt/homebrew/opt/php@7.4/lib/httpd/modules/libphp7.so #LoadModule php_module /opt/homebrew/opt/php@8.0/lib/httpd/modules/libphp.so Die //LoadModule//-Einträge für PHP können **nicht an das Ende der Datei** geschrieben werden, sondern muss zu den anderen //LoadModule//-Einträgen. Sonst wird PHP nicht geladen! Für das URL-Routing von TYPO3 aktivieren wir gleich noch das Modul für die Rewrite-Regeln: LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so Default-User und -Gruppe des Apache ist ''_www''. Um keine Probleme mit Zugriffsrechten zu bekommen, setzen wir uns stattdessen einfach selbst ein: # User _www # Group _www User myusername Group staff Der Homebrew-Apache nutzt den Port ''8080''. Ich ändere ihn auf den bei Webservern üblichen Port ''80'': Listen 80 ==== httpd-vhosts.conf ==== Speicherort: ''/opt/homebrew/etc/httpd/extra/httpd-vhosts.conf'' Ergänzende Konfigurationsdatei. Der Inhalt der bereits vorhandenen Datei kann komplett auskommentiert oder gelöscht werden. Hinein gehört dies: Options Indexes MultiViews FollowSymLinks AllowOverride All Require all granted VirtualDocumentRoot "/Users/sebkln/www/sites/%1/wwwroot" ServerName sites.test ServerAlias *.test UseCanonicalName Off Im Zusammenspiel mit dem weiter oben installierten //dnsmasq// sorgt diese Konfiguration dafür, dass jede Website, die im Ordner ''/Users/sebkln/www/sites/'' liegt und die Struktur ''/kundenname/wwwroot'' besitzt, mit der URL [[http://kundenname.test/|http://kundenname.test/]] aufgerufen werden kann. Wenn du neue Webprojekte anlegst, benötigst du so keine Anpassung von Konfigurationen – du müsst einfach nur die Konvention dieser Struktur beachten. **Anschließend muss der Apache im Terminal neu gestartet werden:** sudo /opt/homebrew/bin/apachectl restart ==== Logfiles ==== Das **access_log** und **error_log** des Apache liegen in folgendem Ordner:\\ ''/opt/homebrew/var/log/httpd/'' ---- ===== 7. MySQL ===== Das Paket ''mysql'' installiert derzeit Version 8.x. Um MySQL 5.7 zu nutzen, wird ''mysql@5.7'' benötigt. **Terminal:** brew install mysql@5.7 MySQL unter M1 Macs bzw. macOS Monterey zu installieren, kann einige Probleme bereiten. Falls du vorher bereits eine andere MySQL-Version installiert hattest, solltest du alle dazugehörigen Dateien und Verzeichnis **komplett entfernen**, bevor du MySQL erneut installierst. * [[https://coderwall.com/p/os6woq/uninstall-all-those-broken-versions-of-mysql-and-re-install-it-with-brew-on-mac-mavericks|Checkliste MySQL]] Bevor wir MySQL starten, müssen wir noch einige Zugriffsrechte korrigieren. Sonst erhalten wir den folgenden Fehler: //"Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)"//. **Terminal:** sudo chown -R _mysql:admin /opt/homebrew/var/mysql sudo chmod -R u+rwX,g+rwX,o-rwx /opt/homebrew/var/mysql Anschließend starten wir den MySQL-Server sowie den einmaligen Installationsvorgang, bei dem wir u.a. ein Passwort vergeben. **Terminal:** mysql.server start mysql_secure_installation ==== my.cnf ==== MySQL kann über die //my.cnf//-Datei [[https://dev.mysql.com/doc/refman/5.7/en/option-files.html|konfiguriert]] werden. Dabei wird MySQL in verschiedenen Verzeichnissen nach dieser Datei suchen. Die Optionen (Konfigurationen) aus den verschiedenen //my.cnf//-Dateien werden addiert. Bestehende Optionen können durch später ausgelesene Dateien überschrieben werden. Mit dem folgenden Befehl wird eine umfangreiche Übersicht ausgegeben. Ganz zu Beginn stehen die berücksichtigten Pfade. **Terminal:** mysqld --verbose --help Default options are read from the following files in the given order: /etc/my.cnf /etc/mysql/my.cnf /opt/homebrew/etc/my.cnf ~/.my.cnf Ich kopiere mir die Default-Datei von Homebrew in mein User-Verzeichnis. **Terminal:** cp -v /opt/homebrew/etc/my.cnf ~/my.cnf Speicherort: ''~/my.cnf'' Die folgenden Einstellungen in der //my.cnf// sind z.B. für TYPO3 wichtig. Es darf kein ''sql_mode'' gesetzt sein! innodb_buffer_pool_size = 128M sql_mode= ---- ===== 8. phpMyAdmin ===== phpMyAdmin kann von der [[https://www.phpmyadmin.net/downloads/|offiziellen Website]] heruntergeladen werden; das englische ZIP-Archiv ist voll ausreichend. Das ZIP entpacken und die Inhalte in folgenden Ordner verschieben: ''/Users/sebkln/www/sites/phpmyadmin/wwwroot/'' Anschließend wird ein Ordner für die Konfiguration erstellt und die nötigen Rechte zugewiesen. **Terminal:** mkdir /Users/sebkln/www/sites/phpmyadmin/wwwroot/config chmod o+w /Users/sebkln/www/sites/phpmyadmin/wwwroot/config Im Browser nun [[http://phpmyadmin.test/setup/|http://phpmyadmin.test/setup/]] öffnen. * Den Button "New server" anklicken * Direkt in den Reiter "Authentication" wechseln * dort als //User for config auth// ''root'' eintragen, falls nicht schon vorhanden * als //Password for config auth// das Passwort eingeben, welches bei der Installation von MySQL vergeben wurde * Unten auf "Apply" klicken * Zurück im //Overview//, muss auch hier noch einmal der Button "Save" betätigt werden. Dies erstellt eine **config.inc.php** im ''config''-Ordner von phpMyAdmin. Diese Datei wird direkt in den Ordner ''wwwroot'' von phpMyAdmin verschoben. Danach kann der ''config''-Ordner gelöscht werden. Das wars schon. Nun ist phpMyAdmin unter [[http://phpmyadmin.test/|http://phpmyadmin.test/]] erreichbar; mit den hinterlegten Zugangsdaten kann man sich einloggen und seine Datenbanken anlegen und verwalten. ---- ===== 9. GraphicsMagick ===== TYPO3 benötigt noch ein Programm zur Bildbearbeitung. Damit werden Thumbnails und optimierte Bilder fürs Frontend generiert. Ich nutze hierfür **GraphicsMagick** (was laut offizieller TYPO3-Dokumentation auch das empfohlene Programm ist). ImageMagick wird grundsätzlich ebenfalls unterstützt, allerdings hatte ich hier teilweise [[https://forge.typo3.org/issues/91274|Probleme mit ImageMagick 7.x]]. brew install graphicsmagick --build-from-source Der Pfad zur Binary lautet:\\ ''/opt/homebrew/bin/'' Mit den folgenden Einstellungen im TYPO3 Install Tool (''LocalConfiguration.php'') erhalte ich saubere Ergebnisse in allen //"Image Processing"//-Tests: 'GFX' => [ 'gdlib_png' => true, 'jpg_quality' => 60, 'processor' => 'GraphicsMagick', 'processor_allowTemporaryMasksAsPng' => 0, 'processor_colorspace' => 'RGB', 'processor_effects' => true, 'processor_enabled' => '1', 'processor_path' => '/opt/homebrew/bin/', 'processor_path_lzw' => '/opt/homebrew/bin/', 'processor_stripColorProfileCommand' => '+profile \'*\' -interlace plane -strip', ], ---- ===== 10. Mailhog (E-Mail-Versand testen) ===== [[https://github.com/mailhog/MailHog|Mailhog]] ist ein praktisches Tool, um Webformulare und E-Mail-Templates zu testen. Gesendete E-Mails werden von Mailhog lokal abgefangen und in einer Weboberfläche dargestellt. brew install mailhog brew services restart mailhog Mailhog ist unter http://127.0.0.1:8025/# erreichbar. ---- ===== Quellen ===== - Die [[tools:local-dev-yosemite|Ursprungsversion dieser Anleitung]] basiert zuallererst auf der [[https://archive.mallinson.ca/os-x-web-development-environment-10-8/|Anleitung von Chris Mallinson]], mit Ergänzungen von [[http://coolestguidesontheplanet.com/get-apache-mysql-php-phpmyadmin-working-osx-10-10-yosemite/|coolestguidesontheplanet.com]]. - Bei der Aktualisierung auf macOS Monterey war das Tutorial auf [[https://getgrav.org/blog/macos-monterey-apache-multiple-php-versions|getgrav.org]] eine große Hilfe. - Der Rest entstammt den Manuals der installierten Programme und diversen Stack Overflow-Topics.