SymfonyLive / SymfonyCon

SymfonyCon Lissabon 2018Recap vom 6. und 7. Dezember in Lissabon, Portugal

Bom Dia! SymfonyCon 2018 in Lissabon, Portugal: kurz vor Ende des Jahres ging es dieses Mal vom 4. bis 8. Dezember ins schöne Lissabon, der Hauptstadt Portugals. Auch dieses Jahr gab es wieder lehrreiche Workshops und an den zwei Konferenztagen etliche interessante Vorträge, von denen wir einige ausgewählte im Folgenden kurz anreißen möchten.

Keynote „Local web server reloaded“Fabien Potencier

Viele Entwickler nutzen noch den integrierten PHP-Webserver über php -S, etliche Docker (auf MacOS und Windows aber oft zu langsam) und natürlich auch nginx und Apache. Der interne php Webserver kann aber beispielsweise kein HTTP-2, kein SSL, nur eine Verbindung zu jedem Zeitpunkt und hat einige weitere Probleme.

Das Team um Fabien hat ein neues Symfony-Binary geschaffen, das ohne Abhängigkeiten und mit neuen Befehlen daherkommt:

  • symfony security:check um composer-json auf vulnerabilities zu prüfen
  • symfony new [--demo][--full] zum Erstellen eines neuen Projekts
  • symfony server:start [-d] zum Starten des in Symfony integrierten Webservers
  • symfony open:local zum Öffnen des Projekts im Browser

Vorteile: root nicht notwendig, HTTP-2 und TLS funktionieren von Grund auf, präferiert PHP-FPM, nimmt im fehlenden Fallautomatisch PHP-CGI, kann mit verschiedenen PHP-Versionen gleichzeitig arbeiten, z.B. wenn man sein Projekt mit verschiedenen PHP-Versionen testen möchte (symfony local:php:list, wechseln der PHP-version mit beispielsweise echo "7.1" > .php-version). Weiterhin:

  • Logs (symfony server:logs) sind alle als semantisches JSON formatiert und human-readable, um Probleme schneller analysieren zu können
  • symfony server:ca:install installiert eine lokale certificate authority und schaltet es für das System frei
  • lokale Domainnamen möglich, statt sich Ports zu merken (z.B. mit Subdomains), symfony proxy:start und symfony proxy:attach:domain [domain name]
  • Weitere Funktionen in Verbindung mit der Symfony Cloud, beispielsweise lokal mit den Daten der Live-Umgebung debuggen durch Nutzung eines Tunnels zur Symfony Cloud

Changing PHPPedro Magalhães

PHP ändert sich inzwischen in festen Abständen von einem Minor-Release pro Jahr. PHP 7.3 ist frisch seit dem 6. Dezember veröffentlicht, Inhalte sind unter anderem:

  • JsonException (JSON_THROW_ON_ERROR)
  • Trailing-Commas in Funktionsaufrufen
  • array_key_first() und array_key_last()
  • flexibles HEREDOC
  • SameSite Cookies (Cookies werden nicht ausgeliefert, wenn der Request von CrossSite-Seite kommt, dennoch möglich für „sichere“ Anfragen, z.B. GET)
  • neuer Hashing-Algorithmus Argon2

Mit PHP 7.4 wird preload kommen, also das Vorladen von eigenen Dateien/Funktionen in PHP in den Arbeitsspeicher, die dann wie PHP-interne Funktionen funktionieren (Performance, interne Verarbeitung) und auch Typed Properties, z.B. public string $happening = "It's". PHP 8.0 beinhaltet schließlich eine korrekte Arrayindexierung, die bisher unerwartet reagieren konnte: $a = [-42 => true] und $a[] = true: bisher neuer Index +1, aber mindestens 0 (also in diesem Fall 0), ab PHP 8.0 wird der Index korrekterweise auf -41 gesetzt.

Wenn man selbst mitmischen möchte, gibt es zahlreiche Möglichkeiten dazu: Mailingliste, docs.php.net für die Dokumentation, bugs.php.net für Bugreports, Stackoverflow, Bugfixing in github.com/php/php-src, Schreiben von Tests für PHP. Für all das benötigt man laut Pedro nur ein geringes Wissen an C, oft ist es schon hilfreich, Impulse einzubringen und die Implementierung anderen zu überlassen.

How static PHP analyzer changed the way I look at codeNicole Cordes

Statische Codeanalyse prüft unter anderem, ob Variablennamen zu lang / kurz sind, ob isX()- und hasY()-Methoden auch tatsächlich boolean-Werte zurückgeben, ob Methoden an sich zu lang sind und lieber aufgeteilt werden sollten, um die Komplexität zu verringern, ob sie zu viele Parameter haben etc. Weiterhin wird der PHP-Code auch strukturell und auf seine Komplexität hin geprüft, beispielsweise ob auskommentierte Codeblöcke oder zu viele return-Statements / return-Types vorhanden sind oder auch, ob es zu viele verschachtelte if-Abfragen gibt, die die Verständlichkeit des Codes erschweren. Kurz vorgestellt wurden vier verschiedene Tools: PHPStan (PHP Static Analysis Tool), PHPMD (PHP Mess Detector), Code Climate, SonarCloud.

Durch die Nutzung statischer Analysetools hat Nicole verinnerlicht, viele der durch die Tools aufgedeckten Fehler von vornherein zu vermeiden und sich bereits vorher Gedanken zu machen, bevor man drauflos programmiert. Wichtig ist auch zu erwähnen, dass je nach Framework viele der vorgeschlagenen Änderungen nicht sinnvoll sein können, da es das Framework nach seinen Best Practices eventuell anders erwartet – hier sollte man die Einstellungen entsprechend setzen, wenn das möglich ist. Wir benutzen bereits PHPStan und werden sicher auch mal in die anderen vorgestellten Tools reinschnuppern.

What’s a typical Symfony 4.2 application like?Nicolas Grekas

Symfony 4.2 ist gerade erschienen und Nicolas hat in seinem Vortrag erklärt, wie eine Standard Symfony 4.2 Applikation aufgebaut ist und welche Änderungen es kürzlich gab. Symfony nutzt die SOLID-Prinzipien und ist ein „reproducable Build“, kann also ausgehend vom gleichen Quellcode und der Umgebung und Instruktionen Bit für Bit exakt gleich reproduziert werden. Die Konfiguratonsdatei services.yaml und die Automatisierung der Konfiguration als einer der wichtigsten Punkte (dazu gehören auch binds und aliases, die nun beide auch typehinted werden können!). Man sollte trotz Automatisierung aber nicht vergessen, wie man selbst Services definiert.

  • Der Konsolenbefehl bin/console debug:autowiring wurde überarbeitet, nun sind auch die benamten Aliases und Beschreibungen in DocBlocks aufgelistet.
  • Umgebungsvariablen können über die Konfiguration und binds an den Container übergeben werden. Die Handhabung mit .env-Dateien wurden mit Symfony 4.2 geändert – es sind nun vier Dateien vorhanden: .env, .env.local, .env.test und .env.test.local, dabei werden die beiden *.local-Dateien nicht commitet, die anderen beiden landen in Git und enthalten keine sensiblen Variablenwerte.
  • Es gibt eine Erweiterung für Secure- und SameSite-Cookies und die Möglichkeit, UTF8 für Routen erlauben.

Keynote „A Year of Symfony“Nicolas Grekas, Sarah Khalil

Im letzten Jahr ist viel passiert.

  • Ausbau der Symfony Console: Es sind nun beispielsweise Tabellen-Header und Tabellen-Footer möglich
  • Web Profiler Verbesserungen: laufende AJAX-Anfragen, .env-Variablen, Log-Level-Filterung, SecurityVoter
  • Messenger-Komponente wurde veröffentlicht
  • Router-Komponente ist mächtig aufgebohrt worden und ist aktuell die schnellste und bietet noch mehr Möglichkeiten
  • Panther: neue Möglichkeit für funktionale Tests im realen Browser
  • Symfony Flex kann nun Pakete gleichzeitig downloaden und ist dadurch bis zu 50 % schneller geworden
  • MakerBundle: erlaubt die schnelle Erzeugung von Standardbausteinen wie Controllern, Entities, Formulare usw.

Zudem gab es im letzten Jahr etwa 400 PRs im offiziellen Symfony-Repo und knapp 500 PRs im Contribution-Repo, beides gute Zahlen.

An dieser Stelle wieder einmal ein herzliches Dankeschön an das Team von SensioLabs und alle Speaker, die uns an den vier Tagen mit spannenden Workshops und Talks einiges geboten haben. Auf der SymfonyCon 2019 in Amsterdam sind wir selbstverständlich auch wieder vertreten und werden davon berichten.

Bilder und Text: Sebastian Blum, Fabian Bloching und Sinan Sözen

Anmerkung: Die hier verwendeten Fotos dürfen gerne kostenfrei verwendet werden! Wir freuen uns über eine Quellenangabe.

Phantasialand 2018

SymfonyLive Phantasialand 2018Recap vom 4. Mai 2018 im Phantasialand, Brühl

SymfonyLive 2018 im Phantasialand, Brühl: die siebte SymfonyLive fand dieses Jahr erstmalig im Phantasialand statt und bescherte uns neben der eigentlichen Konferenz auch jede Menge Achterbahn-Spaß.

Keynote „Symfony 4 / Symfony Flex“Fabien Potencier

Eröffnet hat die diesjährige SymfonyLive der Kopf des Frameworks, Fabien Potencier. In seinem Vortrag ging es um die Neuerungen von Symfony 4 im Zusammenspiel mit dem Composer-Plugin Symfony Flex – in einer Live-Demo wurde gezeigt, was es für Neuerungen bietet und wie man mit dem neuen System umgehen kann.

  • Projekte basieren nicht mehr auf symfony/symfony und sind dadurch auf ein Minimum reduziert.
  • Die Installation erfolgt über composer create-project symfony/skeleton, das nur flex, console, framework-bundle, yaml und lts enthält und für die Development-Umgebung zusätzlich dotenv. Dadurch enthält eine Flex-Installation 70 % weniger Dateien, 75 % weniger Abhängigkeiten und 80 % weniger Commands als die Standard Edition von Symfony.
  • Für Symfony-Pakete können Aliases genutzt werden, z. B. require workflow statt require symfony/workflow.
  • Das maker-bundle erlaubt die Erstellung von Standardbestandteilen über Commands, z. B. kann mittels make:controller BeispielController ein Controller erstellt werden.
  • Durch autoconfigure und autowiring werden viele ehemals lästige Aufgaben vom System übernommen und beispielsweise Services automatisch erstellt.

Handle with care: Verantwortungsvoller Umgang mit (Software-) PaketenMatthias Pigulla

Wenn man Matthias Vortrag mit einem Satz zusammenfassen möchte, so würde dabei so etwas herauskommen wie: „Aus großem Code folgt große Verantwortung“. Dabei zeigt er die wichtigsten Punkte auf, über die man sich bei der Veröffentlichung von Code im Klaren sein sollte.

  • Composer als zentraler Kern der Paketbeschaffung
  • Prinzipien für die Paketerstellung (webfactory.de/uncle-bob-papers aus dem Jahre 1996 als Basis)
  1. Release/Reuse Equivalency Principle (REP): Ein Release macht den Code zu einem Produkt (Name, Supportmöglichkeiten etc.), Zeitliche Entkopplung durch Versionierung, die Schnittstelle ist wichtiger als die Implementierung im Unterbau (Semantic Versioning: 😱.🤗.🤒 als Sicherheit, Minorreleases mit Error-Triggern für kommende Deprecations, Abhängigkeiten nur bei mindestens Minor-Releases veröffentlichen)
  2. Strategisches Paketdesign:
    • Common Reuse Principle (CRP): Alle Teilaspekte einem Pakets gehören zusammen, nutzt man also einen Teil davon, nutzt man zwangsläufig auch alle anderen Teile, also das Paket als Ganzes
    • Common Closure Principle (CCP): Bewirken Änderungen in einem Teil Änderungen in einem anderen Teil, sollten diese beiden Teile zusammengehörig in einem Paket sein.
    • Acyclic Dependencies Principle (ADP): Die Abhängigkeiten zwischen Paketen sollten immer einen azyklischen Graphen bilden (Baton und ComposerRequireChecker als Visualisierungsmöglichkeiten).

Zum Vortrag

Symfony + React = ?Denis Brumann

Kurz zusammengefasst lautet die Lösung der Titel-Gleichung: Symfony + React = 😍

Kurze Vorstellung der React-Basics

  • ES6-Syntax
  • React sorgt dafür, dass Komponenten, deren States sich ändern, automatisch auf der Oberfläche aktualisieren

Mit Symfony

  • Um React sinnvoll mit Symfony nutzen zu können, sollte eine API vorhanden sein (z.B. durch API Platform), um mit HTTP-Calls Inhalte an React zu übergeben
  • zum Testen reicht auch das Symfony-Skeleton: Controller können dafür genutzt werden, um einfache Array-Inhalte als JSON-Response zurückzugeben, die wiederum in React genutzt werden können

Controller - Jenseits von HTTP und SymfonyHans-Christian Otto

Der Vortrag wirft ein neues Licht auf Controller. Durch die Entkopplung von der http-Komponente kann man die Einsatzmöglichkeiten auf nicht-http Prozesse erweitern

  • Routenparameter in die Signatur der Action (Request-Objekt weg)
  • Controller als Service-Container (extends Controller weg)
  • PersistenceLayer/Repository/Gateway mit gewünschten get- und persist-Methoden (Doctrine-Abhängigkeit weg)
  • eigene Response-Klasse, welche die gewünschten Inhalte in eine Response umwandeln (render() weg)
  • das kernel.view Event braucht nun einen EventListener, der über Handler die gewünschten Views erzeugt (beispielsweise HTML, XML, JSON) und in eine SymfonyResponse umwandelt
  • Nutzen: IDE Support für die Responses, Validierung vor Erzeugung des Responses, abstraktere Betrachtung der Controller möglich und dadurch Nutzung außerhalb des WWW, Unit-Testing wird durch die geringere Größe der Controller deutlich vereinfacht
  • das Vorgehen kann allerdings sehr schnell in hohem zusätzlichen Aufwand ausarten und ist daher nicht immer und für jeden Use-Case sinnvoll

Fazit des Vortrags: Controller müssen HttpFoundation\Request und HttpFoundation\Response nicht kennen, das Vorgehen erleichtert den Framework-Wechsel

Better Console ApplicationsChristopher Hertel

Christopher hat anhand einer Beispielapplikation die Vielseitigkeit der Console-Komponente gezeigt.

  • Console-Komponente symfony/console
  • möchte man CLI-Anwendungen mit Dependencies erstellen, ist Symfony Flex wunderbar dafür geeignet
  • Nützliche Tools: Collision Tool über nunomaduro/collision, PHPBench phpbench/phpbench

Applikationstypen

  • Jobs (im Hintergrund, z.B. Queue Workers)
  • Helper (Vordergrund, Interaktivität , z.B. Debugging)
  • Tools (Kombination von Jobs und Helpern, z.B. Composer)

Wer nutzt den Command eigentlich?
Beispielapplikation: Billing Run (monatliche Ausführung, Rechnung für Subscriber) zeigt generelles Vorgehen mit execute, das mehrere Private-Methoden aufruft, das die aktiven Kunden holt, PDFs generiert etc.

  • ganz ok, aber besser: Tests für den Command schreiben! ApplicationTester und CommandTester
  • neben configure() und execute() gibt es noch die Lazy-Methoden initialize() und interact(), letzteres hängt sich vor die Command-Validierung und kann bei optionalen Parametern die Abhandlung übernehmen und sie dadurch required machen
  • Console Events:
    • console.command vor der Command Execution
    • console.error kann während der Command Execution auftauchen
    • console.terminate sobald der Command abgelaufen ist
  • Stopwatch nutzbar
  • keine Business Logik im Command (weder in execute(), noch in den privaten Methoden)! Diese werden in einen Service Layer umgezogen
  • Business Logik sollte vom Framework entkoppelt werden (z.B. Output nicht in der Business Logik), Prüfung mit deptrac sensiolabs-de/deptrac -> Logging und Nutzung von Callables ideal für Background Jobs
  • Für Input und Output gibt es auch SymfonyStyle

Ab Symfony 4.1: Sections erlaubt Ersetzung von Blöcken ($section->overwrite(), $section->clear())

Zum Vortrag

Asynchronous Request ProcessingJan Gregor Emge-Triebel

Da Jan während des Vortrages gefühlte 100 mal betonte: „Alle Message Broker funktionieren gleich“, muss das wohl die Kernaussage seines Vortrages gewesen sein. Seine Code-Beispiele untermauern diese Aussage einrucksvoll und geben Einblick in die Welt der asynchronen Prozesse und Message Queues

Lessons Learned

  • Worker: PHP-Threads vertragen keine Langläufigkeit, Supervisord zum checken und (re-)starten, Booten von Consumern kann dauern, inaktive Prozesse beenden, automatischer Shutdown nach x Messages, Memory-Limits einrichten mit Graceful Shutdowns
  • Messages: kompakt halten, Queues brauchen teilweise viel Arbeitsspeicher, kleine Formate wie JSON oder XML und keine serialisierten Arrays oder ähnliches
  • Message Transformation: JSM/Serializer um JSON zu erzeugen, Deserialisierung beim Consumer
  • Message Header: Angaben über das Format (content-type und version), UUIDs für das Logging nutzen, Metadaten (z.B. Userdaten, SessionIDs, Zeitstempel)

Vorausschauende Sicherheits-ArchitekturBastian Hofmann

Sicherheitslücken bringen teilweise massive Probleme und Riesen-Leaks (u.A. Sony, AdultFriendFinder etc.). Bastian rät zur Prävention durch einen kontinuierlichen Lern-Prozess

Was können Hacker alles machen?:

  • Zugriff auf Datenbank: mongo example.com, offene Ports sind Angriffspunkte (nmap zum Scannen der offenen Ports auf einer Domain als Prüfung)
  • SQL-Injection: escapen, Prepared Statements oder ORM wie Doctrine nutzen
  • HTTP Request Injection: z.B. id=$_GET['id'] mit id=6&admin=true -> z.B. Guzzle nutzen
  • Command Injection: escapen und validieren mit z.B. Regex
  • anderes: Code Injection, XML Entity Injection
  • generell: Statische Code-Analysen durchführen, z.B. mit PHP_CodeSniffer
  • Ausnutzen von Bugs in Libraries: aktuell halten! oder Sensio Security Checker mit symfony.lock Datei, node Security Project
  • Ausnutzen von Bugs in der Infrastruktur: z.B. Webserver, ImageMagick, Docker-Images -> Vuls für Prüfung der Infrastruktur, Traffic encrypten (z.B. Let’s Encrypt), SSLlabs.com, hstspreload.com
  • Brute Force: z.B. auf SessionID (lang halten), Passwörter (lange und kryptische Passwörter, Ratelimits pro IP / Nutzeraccount), Logins loggen (Remote Logout und Notifications über Logins, 2FA)
  • Cross Site Request Forgery: Bilder mit aggresivem SRC-Wert -> GET verbieten, POST-Formulare mit aggresivem Ziel -> CSRF-Tokens, Same Site Cookie
  • XSS Injection: User-generated Content immer escapen oder Templating-Engines wie Twig nutzen, HTMLpurifier, Cookies als HTTPS-only markieren, Content Security Policy setzen (z.B. für JS, Bilder etc., Inline-Script-Tags verbieten)
  • Phishing: Iframes (Einbindung der eigenen Seite in Iframes verbieten), rel=noopener

Zum Vortrag

Bilder und Text: Sebastian Blum, Fabian Bloching und Sinan Sözen

Anmerkung: Die hier verwendeten Fotos dürfen gerne kostenfrei verwendet werden! Wir freuen uns über eine Quellenangabe.

Cluj 2017

SymfonyCon Cluj 2017Recap vom 16. und 17. November 2017 in Cluj, Rumänien

SymfonyCon 2017 in Cluj, Rumänien: für die fünfte, internationale SymfonyCon lud SensioLabs dieses Jahr vom 14. bis 17. November in die schöne Stadt Cluj in Rumänien ein. Neben lehrreichen Workshops gab es an den zwei Konferenztagen auch zahlreiche interessante Vorträge, die wir im Folgenden kurz anreißen möchten.

Donnerstag, 16. November 2017

Keynote „Symfony 4 / Symfony Flex“Fabien Potencier

Eröffnet hat die diesjährige SymfonyCon der Kopf des Frameworks, Fabien Potencier. In seinem Vortrag ging es um das bald erscheinende Symfony 4 mit seinem wichtigsten Bestandteil Symfony Flex – in einer Live-Demo wurde gezeigt, was es für Neuerungen bietet und wie man mit dem neuen System umgehen kann.

  • Projekte basieren nicht mehr auf symfony/symfony und sind dadurch auf ein Minimum reduziert.
  • Die Installation erfolgt über composer create-project symfony/skeleton, das nur flex, console, framework-bundle, yaml und lts enthält und für die Development-Umgebung zusätzlich dotenv. Dadurch enthält eine Flex-Installation 70 % weniger Dateien, 75 % weniger Abhängigkeiten und 80 % weniger Commands als die Standard Edition von Symfony.
  • Für Symfony-Pakete können Aliases genutzt werden, z. B. require workflow statt require symfony/workflow.
  • Das maker-bundle erlaubt die Erstellung von Standardbestandteilen über Commands, z. B. kann mittels make:controller BeispielController ein Controller erstellt werden.
  • Durch autoconfigure und autowiring werden viele ehemals lästige Aufgaben vom System übernommen und beispielsweise Services automatisch erstellt.
  • Die Datenbank-Konfiguration kann, anstatt mit einer Definition mehrzeiliger Datenbank-Parameter, in der Kurzform mysql://name:passwort@ip:port/database angegeben werden.
  • Symfony 4 wird laut Fabien mittelfristig Silex vollständig ersetzen.

Decoupling an application with message queuesDavid Buchmann

David gab mit seinem Vortrag einen Überlick über die Funktionsweise und Einsatzmöglichkeiten von Message Queues in PHP-Anwendungen. Dabei werden eingehende Aufgaben als Value Object in einer Queue gespeichert und dann asynchron von Workern abgearbeitet. Als konkreten Anwendungsfall nannte David eine Webanwendung, in der ein User ein Bild hochladen kann, welches dann serverseitig optimiert wird und dem User dann zur weiteren Bearbeitung zur Verfügung gestellt werden soll. Dem User wird zu Beginn ein vorläufiges Bild mit mittlerer Qualität und kurzer Cache-Zeit zurückgeliefert und der zeitintensive Auftrag, das Bild zu optimieren, in der Queue gespeichert. Wenn der Auftrag abgearbeitet ist, ersetzt dieses dann das schnell ausgelieferte Bild.

Was dabei schief gehen kann:

  • Zu wenig Logging/Monitoring – Läuft alles wie geplant?
  • Kein Einsatz von Aknowledgement – Es erfolgt eine Rückmeldung nach erfolgreicher Abarbeitung einer Aufgabe aus der Queue und erst dann wird diese aus der Queue entfernt. Im Fehlerfall, z.B wenn die Netzwerkverbundung verloren geht, wird der Auftrag dann an einen anderen Worker geschickt.
  • Die Redelivery-Falle – Fehler im Code können dazu führen, dass ein Auftrag immer wieder ausgeführt wird.

Seine Benefits sind:

  • Entkopplung – Reduzierung von Abhängigkeiten
  • Redundanz – Kein Informationsverlust
  • Skalierbarkeit – Anzahl der Worker erhöhen
  • Asynchronität – Abarbeitung der in der Queue gespeicherten Aufträge erst wenn genügend Ressourcen zur Verfügung stehen

Optimizing for PHP 7 – the example of SymfonyJulien Pauli

Julien Pauli ist Mitglied des SensioLabs Tech Teams und arbeitet am PHP 7-Code mit, wodurch die Vorteile von PHP 7 direkt in Symfony Einzug finden. In seinem sehr technischen Vortrag hat Julien die Verbesserungen von PHP 7 im Gegensatz zu PHP 5 vorgestellt und dargestellt, was man bei der Nutzung zu beachten hat.

  • Migriert man frisch zu PHP 7, sollte man die Version 7.0 überspringen und direkt mit 7.1 oder 7.2 starten, da es seit dem Release der Version 7.0 sehr viele Verbesserungen gegeben hat.
  • Zur Laufzeit sollte man Objekte statt Klassen nutzen, da diese sehr viel Speicher einnehmen.
  • Große Klassen sollten zur Laufzeit nicht voll kompiliert werden, wenn man nur einen Teil davon benötigt.
  • Eine kleine Optimierung kann bei PHP-Funktionen dadurch erreicht werden, dass man ihnen ein \ voranstellt, also beispielsweise \strlen($str) statt strlen($str), wodurch PHP angewiesen wird, direkt die PHP-Funktion zu nutzen, statt sie in den eigenen Namespace zu laden.
  • In PHP 7 werden statische Arrays nur einmal kompiliert und danach aus dem OPCache genutzt.
  • Referenz-Variablen werden erst dann im Speicher hinterlegt, wenn sie tatsächlich gebraucht werden.
  • Die Hashtabellen von PHP 7 wurden vollständig neu geschrieben und bieten insbesondere bei packed arrays (Integer-Keys, die kontinuierlich größer werden) 5 % bis 10 % Einsparungen im Speicher – besonders bei sehr großen Arrays ist die Auswirkung deutlich spürbar.
  • In PHP 7 nutzen Strings die Struktur von zend_string, dadurch ist deren Nutzung etwa zehnmal schneller als bei PHP 5. Nutzen sollte man mit PHP 7 die Schreibweise $a = "foo and $b and $c" anstatt $a = "foo and " . $b . " and " . $c.

Building your translation processTobias Nyholm

Beim Aufbau einer Multilingualen Seite müssen viele Dinge beachtet werden. Tobias teilte in seinem Vortag seine Erfahrungen mit der Translation-Komponente von Symfony und die daraus resultierenden Learnings mit uns. Auf folgende Dinge sollte bei der Konzeption geachtet werden:

  • Immer das hreflang-Attribut verwenden.
  • Die jeweilige Sprache kann Einfluss auf das Design nehmen – button label ist beispielsweise im Englischen kürzer als im Russischen.
  • Wenn sich eine Übersetzung ändert, muss diese immer in allen verwendeten Sprachen angepasst werden.
  • Der Translation-Key sollte nie wiederverwendet werden und nach einer im Team abgestimmten Konvention benannt werden – z.B homepage.button.label.

Für Symfony gibt es verschiedene Bundles mit unterschiedlichen Ansätzen. So kann das Hinzufügen von Übersetzungen entweder direkt in der Datei, über den Symfony Profiler oder direkt an der eingesetzen Stelle auf der Seite erfolgen. Tobias nannte konkret die folgenden Bundles:

Dabei empfahl er besonders das LexikTranslationBundle. Mit diesem lassen sich die Übersetzungsdateien einfach in die Datenbank importieren und per Nutzerinterface übersichtlich bearbeiten.

A Journey from Hexagonal Architecture to Event SourcingCarlos Buenosvinos

Carlos ist Vice President of Technology bei XING und hat in seinem Vortrag vorgestellt, wie man von einer Hexagonalen zu einer Event Sourcing Architektur gelangt. Hierbei ist er von einem „Reifemodell“ ausgegangen, die bei sogenanntem Spaghetticode beginnt und ihren Zenit beim Event Sourcing findet.

  1. Spaghetti-Code: wilder Code, wie er zu den Anfängen von PHP existiert hat
  2. Nutzung eines Frameworks: app.php als einziger Einstiegspunkt, oft auf einem MVC-Modell aufbauend
  3. Hexagonale Architektur: Trennung von Abhängigkeiten
  4. Hexagonale Architektur + Domain Events: Hinzufügen von Domain Events
  5. Stepping Stone (CQRS): Trennung von Befehlen und Abfragen
  6. Event Sourcing + CQRS: Entity-Status wird nicht mehr aus der Datenbank gelesen, sondern aus dem Event Stream berechnet

Um von der zweiten Evolutionsstufe zu einer Hexagonalen Architektur zu gelagen, nimmt man beliebige Actions, die Business Logik enthalten, und lagert diese in Application Services aus und entfernt zudem jegliche Infrastruktur-Referenzen. Die Implementierung von Domain Events ist im Regelfall in wenigen Minuten erledigt und solche Events sollten anschließend immer dann gefeuert werden, wenn es einen guten Grund dazu gibt, z.B. sich eine Abteilung bestimmte Events wünscht. Listener fangen diese Events anschließend ab und sichern sie in Elastic Search, MySQL usw.

Discovering and solving performance issuesDenis Brumann

Denis, dessen diesjähriger Vortrag über Caching in Symfonyanwendungen auf der SymfonyLive in Berlin bereits sehr interessant war, hat dieses Mal über das Finden und Beheben von Performanceproblemen referiert. Hierfür hat er mehrere Tools vorgestellt, die er selbst nutzt und einige weitere Tipps gegeben, die man beherzigen sollte.

Die Symfony Web Profiler Toolbar ist hierbei das erste Tool, das aktuell noch direkt in Symfony 3 eingebunden ist – in Symfony 4 ist es zwar nutzbar, muss aber erst eigenständig eingebunden werden. Sie zeigt Informationen und Probleme über Ladezeiten, Twig, Doctrine und viele andere Module an und dient als guter Einstiegspunkt für erste Analysen. Das ausführlich dokumentierte Tool JMeter erlaubt Lasttests auf Webseiten (Kapazitäts-, Lade- und Stresstests), wobei diese auch in Dashboards visuell dargestellt werden können. Das dritte Tool im Bunde ist blackfire.io, welches als professionelles Tool noch deutlich mehr Informationen liefert und beispielsweise nach Optimierungen im Code das Maß der Verbesserung im Vergleich anzeigen kann.

Als Literatur empfiehlt Denis das Buch Performance Testing Guidance for Web Applications von Microsoft. Auch ein Update auf PHP 7 wurde in seinem Vortrag empfohlen – dies war auf der diesjährigen SymfonyCon generell in sehr vielen Vorträgen ein wichtiger Punkt, was unseren bereits eingeschlagenen Weg bestätigt.

Freitag, 17. November 2017

Keynote „PHP 7 and beyond: 7.2+“Sara Golemon

Sara hatte als PHP-Core-Entwicklerin viele Informationen über PHP 7 parat und worauf wir uns in Zukunft noch freuen dürfen. Interessant ist der Fakt, dass bereits über 50 % der Composer-Nutzer auf PHP 7 upgegraded haben – Tendenz steigend. Im direkten Vergleich ist nämlich PHP 7 mindestens doppelt so schnell wie PHP 5 (bezogen auf Request pro Sekunde) und PHP 7.2 noch einmal 10 % schneller als PHP 7.1 – ein Upgrade lohnt sich also auf jeden Fall. Zudem bringt PHP 7 diverse Neuerungen mit:

  • Einführung von strikten Skalartypen mit declare(strict_types=1), womit z. B. in dem Aufruf print(sum(2, '3', 4.1)) die 3 nicht mehr akzeptiert wird und einen Fehler produziert, da es eigentlich ein String ist.
  • Arrays werden intern deutlich effizienter behandelt.
  • Einführung eines kryptographisch sicheren Zufallszahlengenerators (CSPRNG) und des Kryptographieverfahrens Argon2i, sowie der Kryptographie-Bibliothek Sodium.
  • Neuer Vergleichoperator <=> und der Operator ?? für eine Null-Koaleszenz
  • Stärkere Einbindung von HTTP/2

Für die Zukunft ist eine Einbindung von Perl-kompatiblen regulären Ausdrücken in der Version 2 (PCRE2) geplant, sowie (endlich) die Verschönerung der Heredoc-Syntax durch die Möglichkeit, das schließende Tag einzurücken. Auch kürzere Closures in den Formen fn($x) => $foo + $x und $x ~> $foo + $x oder als partielle Funktion &{$foo + $1} sind im Gespräch. Weiterhin gibt es Ideen zu neuen Funktionen wie function +($a, $b) = { return $a + $b; } und die Erweiterung von try-/catch-Blöcken um Wiederholungen in der Form try {...} retry 3 catch {...} catch ($e) {...}.

Mastering regex incantationsTomasz Kowalczyk

Tomasz zeigte anhand von Beispiel-Strings reguläre Ausdrücke für Fortgeschrittene. Er machte deutlich, dass man sich auch mit der Wissenschaft beschäftigen sollte, die hinter der Auflösung von Regex steckt (Thompson’s construction). Durch ein besseres Verständnis können viele Expressions, die sonst deterministisch abgearbeitet werden, auch zu einer größeren Regex zusammengefasst werden und so Ressourcen gespart bzw. die Performance optimiert werden. Für ein tieferes Verständnis empfiehlt er besonders die folgenden Quellen:

sowie die Tools:

Learning: Es ist lohnenswert, sich auch einmal tiefergehend mit der Magie zu beschäftigen, welche hinter der Funktionsweise der Regex steckt.

Webpack Encore – Pro JavaScript and CSS for EveryoneRyan Weaver

Ryan hat in seinem Speak, neben diverser Informationen zu JavaScript an sich, das Paket Webpack Encore vorgestellt – eine Möglichkeit, die oftmals komplizierte Einbindung von Webpack in eigene Applikationen zu vereinfachen. Für Symfony steht dafür symfony/webpack-encore zur Verfügung.

  • JavaScript-Dateien werden in der Datei /web/build/app.js zusammengefasst
  • CSS entsprechend in der Datei /web/build/app.css
  • Bilder landen in /web/build/images/ und Schriften in /web/build/fonts/
  • Globale Variablen sind nicht direkt möglich, daher benötigt man beispielsweise für jQuery import $ from 'jquery', nachdem man es mit yarn add jquery ins Projekt eingebunden hat.
  • Möchte man SASS nutzen, muss dies ebenfalls durch yarn add sass-loader erst per Yarn ins System geladen werden.
  • Durch .createSharedEntry('app', './assets/js/app.js') kann Webpack Encore mitgeteilt werden, dass alles, was in der app.js eingebunden ist, nicht mehrfach in anderen Dateien eingebunden werden soll (was der Normalfall ist, wenn man beispielsweise in mehreren Dateien jQuery importiert).
  • Mit .enableVersioning() kann die Versionierung der erzeugten Dateien aktiviert werden. Durch die manifest.json kann dabei die Problematik der ständig neuen Versionen gebändigt werden, welche ansonsten nicht gefunden werden könnten.

Doctrine Performance OptimizationAnna Filina

Der Vortrag von Anna behandelte Möglichkeiten, wie man mit relativ wenig Aufwand die Nutzung der drei Hauptressourcen Prozessorlast, Speichernutzung und den Laufwerkszugriff drastisch senken kann. Für diesen Zweck hat sie ein Benchmark vorgestellt, bei dem es darum geht, 2.000 personalisierte E-Mails zu befüllen – zur Erzeugung der Testdaten wurde die Bibliothek Faker genutzt.

  • 1. Iteration: Standardnutzung ohne Tweaks (2,3 Sekunden für die Abfragen, 3,5 Sekunden für alles andere, 10,61 MB Speichernutzung, 8000 Datenbankabfragen)
  • 2. Iteration: Gruppierung von Properties bei der Datenbankabfrage (insgesamt 35-mal schneller, 22,01 MB Speichernutzung, nur noch 5 Datenbankabfragen)
  • 3. Iteration: Array-Hydration der Abfrageergebnisse (Senkung der Speichernutzung auf nur noch 6,43 MB)
  • 4. Iteration: Speicherfreigabe durch unset($array) (weitere Senkung der Speichernutzung auf 5,64 MB)
  • 5. Iteration: Laden der Nutzer in Batches von 200 (finales Ergebnis von nur noch 5,04 MB Speichernutzung bei 50 Datenbankqueries und doppelter Zeit von 0,1134s)

Insgesamt ein sehr erstaunliches Ergebnis, das lediglich durch kleinere Anpassungen erreicht worden ist.

A year of SymfonySarah Khalil

Sarah hat zum Abschluss der Konferenz die wichtigsten Facts des letzten Jahres zusammenfassend dargestellt. Seit der letzten SymfonyCon in Berlin im Jahr 2016 wurden im Rahmen des Symfony-Projektes durch die Community 1727 Merges durchgeführt und 1232 Issues erfolgreich gelöst – durchaus beeindruckende Zahlen für einen Zeitraum von elf Monaten. Zudem wurde im September diesen Jahres die Marke von 1.000.000.000 Downloads des Symfony-Projektes geknackt.

Außerdem haben im letzten Jahr viele neue Funktionen Einzug in Symfony gefunden, insbesondere in Version 3.4, welche die selben Features wie das bald erscheinende Symfony 4.0 enthält – davon sollen an dieser Stelle nur einige Erwähnung finden.

  • Das Autowiring erleichtert die Arbeit mit Services, welche durch diese Änderung zukünftig per default nicht mehr public sind – ist das doch gewünscht, müssen diese mittels public: true sichtbar gemacht werden. Der Konsolenbefehl debug:autowiring listet alle dadurch erzeugten Services auf.
  • Diverse neue HTML5-Types (z. B. TelType) und Konsolenbefehle (z. B. debug:form) haben sich einen Platz im Symfony-Kern gesichert.
  • Für Commands ist nun auch ein lazy loading möglich, um beispielsweise gewichtige Commands später nachzuladen und das System beim Starten nicht unnötig zu verlangsamen.
  • Beim Thema Sicherheit kam der Support für Argon2i als Kryptographieverfahren hinzu und die Symfony Toolbar bietet für das Impersonating viele neue Informationen, u.a. die Anzeige des Benutzernamens des nachgeahmten Benutzers.

Zum Abschluss wurden in Kürze noch noch einige Neuerungen von Symfony 4 erwähnt, wobei wir an dieser Stelle für Details auf die Eingangs-Keynote verweisen möchten. Mit diesem Thema wurde dann auch der Kreis geschlossen, mit dem die diesjährige Konferenz begonnen hat: Symfony 4 kommt mit großen Schritten und auch wir freuen uns bereits darauf, damit zu arbeiten, da vieles sehr vielversprechend ist. Es bleibt spannend.

An dieser Stelle ein herzliches Dankeschön an das Team von SensioLabs Frankreich und alle Speaker, die uns vier Tage mit spannenden Workshops und Talks geboten haben. Wir freuen uns bereits jetzt in 2018 auf die SymfonyLive im Phantasialand und die SymfonyCon in Lissabon und werden selbstverständlich wieder vor Ort sein und von den Events berichten!

Bilder und Text: Fabian Bloching und Sinan Sözen

Anmerkung: Die hier verwendeten Fotos dürfen gerne kostenfrei verwendet werden! Wir freuen uns über eine Quellenangabe.

Berlin 2017

SymfonyLive Berlin 2017Recap vom 27. Oktober 2017 in Berlin

SymfonyLive 2017 in Berlin: die siebte SymfonyLive fand dieses Jahr vom 25. bis 27. Oktober in Berlin statt und bescherte uns lehrreiche Workshops und einen hochinteressanten Konferenztag. Die neuesten Learnings aus der Symfony-Welt erfährst du hier.

Keynote „Using Open Source for Fun and Profit“Gary Hockin

Der diesjährige Konferenztag in Berlin wurde von Gary Hockin eröffnet. Die Quintessenz seines humoristisch aufgezogenen Talks: Contributions sind wertvoll! Es sind „Free Code Reviews“ – quasi kostenlose Learnings. Sie öffnen einem Türen, die vorher verschlossen waren. Es ist lohnenswert, sich durch Contributions einen Namen in der Szene zu machen – man baut Kontakte auf, lernt selbst immer mehr dazu und wird irgendwann selber zum Experten. In seinem Fall hat es sogar soweit geführt, dass er irgendwann als Speaker auf eine Konferenz eingeladen worden ist und seitdem eine erfolgreiche Karriere führt. Sein Tipp: Einfach mal trauen, es lohnt sich in jedem Fall.

Insgesamt ein sehr informativer und gelungener Auftakt in den Konferenztag.

Symfony Dependency Injection in 2017Alexander Turek

Alexander gab in seinem Vortrag einen guten Überblick über die Möglichkeiten, welche der ab Symfony Version 3.3 erneuerte Dependency Injection Container mit sich bringt.

  • Mit Autowiring sind Controller jetzt automatisch als Service verfügbar
  • _defaults ermöglicht es, Einstellungen für alle Services derselben Konfigurationsdatei vorzunehmen.
  • Durch die Einführung von Named Parameters müssen nicht mehr alle Service Parameter spezifiziert werden.
  • Mit Hilfe von Service Locators kann eine Teilmenge der verfügbaren Services als Container zur Verfügung gestellt werden.

Learning: Durch das Autowiring von eigenen Controllern müssen diese nicht mehr von der abstrakten Controller-Klasse ableiten.

CQRS und Event Sourcing BasicsAlexander Miertsch

Alexander Miertsch, seines Zeichens Gründer und CEO der prooph software GmbH, kam mit einem sehr interessanten Thema zur SymfonyLive: dem Event Sourcing. Das von ihm mitentwickelte Framework prooph ist kompatibel zu allen großen PHP-Frameworks wie Symfony, Zend und Laravel und auch mit diversen anderen Systemen nutzbar.

Beginnen sollte man immer mit einem Event Storming, bei dem man sich mit seinen Stakeholdern zusammensetzt und ein Brainstorming hinsichtlich der Domain Events und Ziele vollzieht und mögliche Szenarien betrachtet. Anschließend erstellt man Ablaufdiagramme aus den Domain Event-Systemen – dies können beispielsweise bei einem Bestellsystem die Domains OrderPlaced, OrderPayed und OrderShipped sein. Die Richtung der Benachrichtigungen werden durch Pfeile symbolisiert. OrderShipped wird erst ausgeführt, wenn es sowohl von OrderPlaced, als auch von OrderPayed eine Benachrichtigung erhalten hat.

Speichert man die States eines Objekts direkt beim Objekt selbst, kann es passieren, dass beim sequentiellen Abarbeiten der jeweiligen Funktion Fehler auftreten und die Buchungen nur teilweise ausgeführt werden, beispielsweise wenn die Datenbank für einen Moment streikt – hier kann Event Sourcing effektiv helfen, Fehler zu vermeiden. Die States werden nicht mehr in der Datenbank gespeichert, sondern in einem Event Stream, der kontinuierlich die Events chronologisch sichert. Der aktuelle Stand des Systems kann nun durch ein Left Folding jederzeit aus dem Event Stream berechnet werden. Auch können durch Betrachtung vergangener Event-Teilketten die Gründe für Problemfälle schnell rekonstruiert und dadurch gefunden werden. Zudem besteht die Möglichkeit für zeitbasierte Queries, beispielsweise wenn man herausfinden möchte, welche Nutzer ihren Benutzernamen innerhalb der ersten fünf Minuten nach ihrer Anmeldung geändert haben.

Für die Nutzung mit Symfony kann man auf das Bundle prooph/event-store-symfony-bundle zurückgreifen, das sowohl das Event-Sourcing-Modul, als auch den Event-Store enthält.

Domain-Specific AssertionsSebastian Bergmann

Sebastian konnte anhand von Code-Beispielen eindrucksvoll die Wichtigkeit von „lesbarem Code“ verdeutlichen. Tests sollten immer so sprechend geschrieben werden, dass auch Nicht-Entwickler verstehen können, was eigentlich genau getestet wird. Dabei bezog er sich sogar auf die „10 Sekunden Regel“: diese sagt, dass Code der nach erstmaligem Betrachten auch nach zehn Sekunden noch nicht verstanden wurde, zu komplex ist und neu geschrieben werden muss. Testgetriebene Entwicklung hilft dabei, die Probleme zu verstehen und nicht einfach nur ein Programm zu schreiben.

Sebastian hat gezeigt, wie man mit PHPUnit eigene Assertions implementiert, die schnell umgesetzt sind und eine allgemeinere Sprache sprechen.

Learning: Eigenen Test-Code zusammen mit Nicht-Entwicklern auf Verständlichkeit prüfen.

Volltextsuche in Theorie und PraxisPhilipp Krenn

Philipp Krenn hat in seinem Talk die Funktionen von elasticsearch für die Volltextsuche vorgestellt. Die Volltextsuche geht dabei weg vom Schwarz/weiß-Suchen hin zu „Graustufen“, also einer deutlich filigraneren Betrachtungsweise. Das Vorgehen beim Speichern von Texten ist im Allgemeinen immer gleich, auch wenn die einzelnen Schritte beliebig aktiviert und deaktiviert werden können – dies soll an einem Beispiel verdeutlicht werden (These are not the droids you are looking for.):

  • Die Formatierungen im Text werden entfernt (These are not the droids you are looking for.).
  • Durch das Tokenizing werden Satzzeichen entfernt und die Worte des Textes in einzelne Tokens getrennt (These are not the droids you are looking for).
  • Anschließend werden alle Großbuchstaben zu Kleinbuchstaben umgewandelt (these are not the droids you are looking for).
  • Im nächsten Schritt werden sogenannte stop words entfernt, also Wörter, die sehr häufig in der jeweiligen Sprache vorkommen und für die Aussagekraft des Textes wenig bringen (droids you looking). Hier sollte erwähnt werden, dass die Entfernung von stop words nicht immer sinnvoll ist, beispielsweise würde bei „to be or not to be“ nichts mehr übrig bleiben.
  • Im letzten Schritt werden noch die übrig gebliebenen Wörter normalisiert, indem sie auf ihren Wortstamm reduziert werden (droid you look).

Als weitere Optionen steht die Festlegung von Synonymen, mit slop die Angabe der Anzahl erlaubter Wörter zwischen den Tokens und mit fuzziness die Angabe einer Art Hemming-Distanz zur Verfügung, also einer Zahl, die angibt, um wie viele Buchstaben sich der Suchterm vom eigentlichen Wort unterscheiden darf.

Die Problematik der deutschen Sprache mit zusammengesetzten Wörtern kann durch das Plugin German Decompounder gelöst werden. Eine automatische Spracherkennung bietet das Plugin Detecting Languages. Speziell für Symfony existiert das Bundle ONGR Elasticsearch.

Monitoring und Metriken im WunderlandPaul Seiffert & Dennis Benkert

Paul Seiffert und Dennis Benkert von Jimdo haben in ihrem Talk vorgestellt, wie sie in ihrem „Wunderland“ (so nennen sie liebevoll die Akkumulation aller Services bei Jimdo) durch Monitoring und Nutzung von Metriken auf Fehler aufmerksam werden, um diese anschließend beheben zu können.

Das Monitoring wird hierbei durch die Software Prometheus durchgeführt und das Alerting durch pagerduty. Bei den Metriken wird unterschieden nach

  • Applikationsmetriken, beispielsweise die Anzahl verarbeiteter Queries, die Anzahl Request pro Route oder die Anzahl der Aufrufe einzelner Symfony-Controller,
  • Systemmetriken wie die CPU- oder Speichernutzung und die Festplattenauslastung und
  • Infrastrukturmetriken wie die Request pro Sekunde, die Anzahl der VMs oder auch die Netzwerkauslastung.

Die ermittelten Daten werden anschließend mit Grafana visualisiert und in Dashboards zusammengefasst.

Caching in Symfonyanwendungen – Ein ÜberblickDenis Brumann

Denis Bruman hat in seinem Talk einen guten Überblick darüber gegeben, welche Caching-Möglichkeiten es bei der Nutzung von Symfony gibt. Symfony bietet von sich aus bereits diverse Caching-Adapter an:

  • Der APCu Adapter hat eine sehr gute Performanz, solange es nicht zu viele Schreib-/Leseoperationen gibt.
  • Für größere Cluster an Cache-Knoten ist Memcached oder Redis empfehlenswert.
  • Auch das Dateisystem kann mit dem Filesystem Adapter als Cache genutzt werden, ist aber für Production-Umgebungen von Natur aus zu langsam.
  • Für Tests kann der Systemspeicher mit dem Array Adapter genutzt werden.

Zur Auflistung aller verfügbaren Adapter kann man den Konsolenbefehl bin/console debug:container cache.adapter nutzen. Mit der Funktion tag() können Cache Items im Cache Pool über Tags miteinander verknüpft und durch invalidateTags() wieder entknüpft werden.

Als weitere Option steht das browserseitige HTTP Caching zur Verfügung, die man mittels Annotation aktivieren kann (z.B. @Cache(maxage="600")), um dem Browser mitzuteilen, dass die Seite zehn Minuten lang aus dem Browsercache geladen werden soll. Im Rahmen des Server-Side Caching kann man beispielsweise Varnish oder den AppCache von Symfony nutzen. Auch ein Validation Caching gehört zu den vorhandenen Möglichkeiten.

Lessons Learned After 10 Years of TestingChris Hartjes

Auch zum Abschluss gab es einen humoristischen Talk, dieses Mal vom Test-Evangelisten Chris Hartjes, auch bekannt als der „grumpy programmer.“ Kernaussagen seines Talks waren 5 „Lessons learned“:

  1. Eine einzelne motivierte Person alleine reicht nicht aus.
  2. Wenn ein Projekt Tests hat, hat zumindest irgendwann einmal jemand Interesse daran gehabt, dass der Code funktioniert.
  3. Menschen haben Probleme, mit dem Testen anzufangen, wenn Ihnen niemand dabei hilft.
  4. Alle Probleme wurden bereits in den 70er Jahren gelöst – dies ist eine Anspielung auf das Buch Software Testing Techniques von Boris Beizer.
  5. Das Problem sind die Menschen an sich. Es ist egal, welches Framework man nutzt. Wichtig ist es, Probleme zu lösen. Die beste Waffe gegen Toxizität ist Empathie.

Auch er erwähnte einmal mehr, dass inzwischen diverse Studien beweisen, dass trotz 30 % höherem Programmieraufwand, durch die Anwendung von Tests 40 % – 50 % weniger Bugs in Softwareprojekten auftauchen und dadurch langfristig viel Zeit und vorallem Geld eingespart werden kann.

Mal wieder ein sehr sympathischer Abschluss der SymfonyLive. Wir freuen uns auf die SymfonyCon Mitte November in Cluj, Rumänien und im kommenden Jahr auf die SymfonyLive im Phantasialand und werden selbstverständlich wieder mit dabei sein.

Bilder und Text: Sebastian Blum, Fabian Bloching und Sinan Sözen

Anmerkung: Die hier verwendeten Fotos dürfen gerne kostenfrei verwendet werden! Wir freuen uns über eine Quellenangabe.

Köln 2017

SymfonyLive Köln 2017Recap vom 7. April 2017 in Köln

SymfonyLive 2017 in Köln: die sechste SymfonyLive fand dieses Jahr wieder in Köln statt und bescherte uns lehrreiche Workshops und einen hochinteressanten Konferenztag.

Keynote „Technische Schulden tun weh! Wie man sie erkennt und beseitigt“Carola Lilienthal

Eröffnet wurde der Konferenztag von Carola Lilienthal, Geschäftsführerin der WorkPlace Solutions GmbH und Softwarearchitektin aus Leidenschaft.

In ihrer Keynote hat sie anhand ihrer langjährigen Erfahrungen erläutert, wie man technische Schulden minimieren kann. Wichtige Punkte sind unter anderem:

  • „Jahresringe“ nicht zum Prinzip machen und Schulden rechtzeitig in den Griff bekommen, d.h. Fehler und Probleme nicht unter einer neuen, moderneren Schale verstecken, sondern sie im Kern angehen und beheben!
  • Langlebigkeit durch:
    1. Wartbarkeit, d.h. schnelle Fehleranalyse, schnelle Anpassungen, Handlungssicherheit, Flexibilität, durchführbar beispielsweise durch die Aufbrechung der Software in Microservices
    2. Flexibilität durch Varianten von Geschäftsprozessen, Serviceorientierung, Skalierbarkeit → Baukastenprinzip (70% der Zeit wird dafür verwendet, den bisherigen Code zu verstehen, 20% zur Lösungsfindung und nur 10% für die tatsächliche Implementierung)
  • Code soll einfach sein! Man programmiert nicht für den Compiler oder die Laufzeitumgebung, sondern für den nächsten Entwickler, der den Code lesen und verstehen muss.
  • Kognitive Maßnahmen können ebenfalls helfen:
    1. Chunking (Abstraktion): Zusammenfassen von Informationen zu größeren Einheiten, sprich Modularität (Single Responsibility Principle)
    2. Hierarchien sind besser und einfacher als Netze.
    3. Aufbau von Schemata: Musterkonsistenz hilft dem Verständnis
  • Nicht nur die technische Struktur optimieren, sondern auch die fachliche. Oft ist es auch sinnvoll, die ersten Überlegungen in die fachliche Struktur zu stecken.

Insgesamt ein sehr informativer und gelungener Auftakt in den Konferenztag.

Erwarte die Ausnahmen – Elegante FehlerbehandlungBastian Hofmann

„Fehler passieren“ war wohl das Buzzwort des Vortrags von Bastian Hofmann. Wichtig ist es daher, schnell auf Fehler zu reagieren, Bugs zu lokalisieren und zu beheben.

  • Logging hilft ungemein! Auch sollte man Fehlercodes, Informationen über den Request, IPs und User Agents mitloggen, um Fehlerursachen einfach zu verstehen.
  • Bei Fatal Errors wird die Codeausführung abgebrochen – hier können Shutdown Handler helfen, die Fehler zu loggen oder doch noch Fehlerseiten auszugeben.
  • Logs von verschiedenen Services und Servern sollten zentral an einer Stelle zusammengefasst werden, um sie besser durchsuchen zu können – hier kann z.B. eine Kombination von Logstash, Elastic Search und Kibana helfen.
  • Zeitmessungen sind wichtig. Anhand der Standard-Timings können über Dashboards und Benachrichtigungen durch z.B. Nagios Abweichungen schnell und unkompliziert erkannt werden.
  • Eine weitere Möglichkeit ist es, den Service in kleinere Funktionalitäten aufzuteilen, die man bei Problemen unabhängig voneinander deaktivieren kann, ohne dass die gesamte Seite Fehler schmeißt.
  • Bei Fehlern sollten lange Timeouts vermieden und der Nutzer lieber schnell über die Fehlfunktion informiert werden.
  • Load Balancer können z.B. sekündlich einen kleinen Health Check auf die Services auslösen und solche rausnehmen, die nicht schnell genug antworten – ein Circuit Breaker trennt hierbei die Kommunikation zu dem Service und lässt ihm Zeit zum Recovern. Durch das anschließende Erlauben eines einzelnen Requests in definierten Zeitabständen kann dann geprüft werden, ob der Service wieder anwesend ist (auch nutzbar als Throttle Control, z.B. durch Phystrix).

Build and ship a feature on trivagoChristoph Reinartz

YOLO! Auf diesem Motto war der sehr unterhaltsame Vortrag von Christoph Reinartz aufgebaut. In einem amüsanten Live Feature Build und anschließendem Deployment hat Christoph gezeigt, wie in Grundzügen ein neues Feature bei Trivago seinen Weg in die bestehende Software findet.

Angefangen beim JIRA-Task über einen Feature Toggle für die geplante Modal Box, deren Inhalt (wie kann es anders sein) eine Miezekatze darstellt, über git push und Erstellung des Pull Requests hin zum Deployment (bei Trivago ganze 16 Stück, unter anderem für den Right-to-left-Support). In JIRA folgt nach dem Review die automatische Änderung des Ticket-Status auf QA, womit die QA-Leute den Task direkt auf ihr Dashboard bekommen und mit dem Testen beginnen können.

Im Großen und Ganzen entspricht das Vorgehen von Trivago auch unserem eigenen, was uns in unserem Tun bestätigt.

Achja, #yolo!

Business Workflow in Symfony modellierenChristian Flothmann

Christian – langjähriger SensioLabs Core Entwickler – hat während seines Vortrags die neue Funktionalität der Workflow-Komponente in Symfony anhand eines Onlinestores anschaulich vorgestellt. Ein Workflow besteht aus

  • einem Subject, welches das Object bezeichnet, auf das der Workflow angewendet wird,
  • Places, also Zustände, die ein Subject annehmen kann,
  • Transitions, welche die Zustandsübergänge definieren und
  • Markings, welche Zuständen entsprechen, in denen sich der Workflow gerade befindet.

Hierbei kann ein Event-System das Auslösen von Events übernehmen, z.B. eine Transition auslösen. GuardEvents hingegen blockieren die Ausführung von Transitionen, wenn beispielsweise die Rolle für das Ausführen der Transition nicht ausreichend hoch ist. Mehr zu dem Thema gibt es im offiziellen Symfony Blog.

Ansible Tips ‘n’ TricksLukas Sadzik

Lukas Sadzik, seines Zeichens Software Developer bei SensioLabs und laut eigener Aussage die Faulheit in Person – er liebt Automatisierung und das Tool seiner Wahl ist hierbei Ansible, für das er Tipps an fortgeschrittene Nutzer parat hatte:

  • Directory Layout bei kleinen und mittelgroßen Projekten
  • IPs nutzen und Hosts gruppieren
  • „echte“ YAML Syntax statt Inline-Layout nutzen → keine Einzeiler
  • Benutzerverwaltung mit ansible bietet viel Flexibilität
  • Ansible Galaxy: packagist der ansible-Welt → Rollen, die bereits von anderen geschrieben wurden mindestens als gute Inspiration nutzen, eigene zu schreiben
  • Namenskonvention, die Flexibilität bietet:
    1. user_name: my_user
    2. user_home: “/home/{{ user_name }}”
  • become: true → Ersatz für sudo (become another user)
  • lieber Includes als Blöcke nutzen!
  • from_json und from_yaml filter zum Lesen von Input aus JSON- oder YAML-Dateien

Learn Redis the hard way … in productionAndy Grunwald

Andy Grunwald, Software Engineer bei Trivago, hat vor einigen Jahren noch vollkommen grün hinter den Ohren die Redis Infrastruktur bei Trivago übernommen. Humorvoll hat er dargelegt, was für schlaflose und brisante Monate er bei der Übernahme durchlaufen hat – unter anderem führten zu Spitzenzeiten 40% der weltweiten Requests zu Serverfehlern, beispielsweise weil Redis Connections nicht automatisch schließt. All die Fehlerquellen ausfindig zu machen hat Andy und sein Team mehrere Monate Stress beschert.

Ausgehend von seinen Erfahrungen hatte er anschließend fünf Tipps für Entwickler, die mit Redis liebäugeln und noch keine Expertise sammeln konnten:

  1. Redis ist single threaded: Jeder Command blockt für eine gewisse Art und Weise. Das sollte man immer beachten!
  2. Persistence kontrollieren, kann massiv Zeit und Ressourcen verschlingen.
  3. Wenn viele Operationen von verschiedenen Systemen auf Redis laufen, können sie sich gegenseitig blockieren → Redis-Instanzen trennen!
  4. Zeitkomplexität von Befehlen checken → gewisse Redis-Befehle haben eine Zeitkomplexität von O(n), in denen einfach alles geblockt wird. Das kann in gewissen Szenarien zum totalen Stillstand führen und sollte tunlichst vermieden werden.
  5. Einen Proxy dazwischen zu schalten kann helfen, den Connection Overhead zu reduzieren und teure und gefährliche Operationen zu blockieren!

Was Symfony für IT-Sicherheit unternimmt und was nichtAndreas Sperber

Heute sind viele Unternehmen Ziel von Angriffen aus dem Internet – die häufigsten Angriffe basieren hierbei allen voran auf Cross-Site-Scripting (z.B. Key-Stroke-Listener) und Content Spoofing (z.B. Fake-Loginboxen), aber auch Injections, Cross-Site-Request-Forgery, Verlust sensitiver Daten und Brute Force sind Begrifflichkeiten, mit denen man sich unbedingt auseinandersetzen sollte. Hierbei muss für jedes Unternehmen initial das individuelle Threat Model überlegt werden – kleinere Unternehmen werden anders angegriffen als große.

Symfony bringt bereits viele Funktionen mit, die man einfach nutzen kann:

  • Output-Escaping mit Twig: HTML-Code wird per default escaped, aber auch für JavaScript möglich z.B. mit {% autoescape 'js' %} oder auch deaktivierbar mit {% autoescape false %}
  • Content Security Policy Header gegen Client-Injections (Blogbeitrag im Aramido Blog vom 10.08.2016)
  • Prepared statements gegen Injections
  • Eingabedatenvalidierung mit Regex, z.B. @Assert\Regex
  • CSRF-Tokens und Same Origin Policy gegen Cross Site Request Forgery
  • Logging und Sperrungen von IPs gegen Brute Force

Dependency Management ist mehr als „composer update“Nils Adermann

Dependency Management kann zur Build-/Laufzeit stattfinden und besteht aus Assembly, Dependency Change Management, Risikoanalyse und -minimierung

  • Dependency Assembly: Installieren (composer install), Konfiguration zum Verbinden mit Services (Authentifizierung) → früher Installationsanleitung, heute Beschreibung eines Systemzustandes (composer.json), Werkzeuge zum Herstellen des Zustands (composer)
  • Dependency Change Management: Dependency Change beschreibt das Hinzufügen, Ändern, Entfernen von Bibliotheken (composer update), das Management betrachtet die Risiken, Auswirkungen, Kosten und Vorteile des Dependency Changes
  • Risikoanalyse und -minimierung:
    1. Verfügbarkeit: z.B. Open Source Bibliothek gelöscht, Payment Service nicht verfügbar, Jenkins nicht verfügbar. Hier helfen composer cache, forks oder Private Packagist als eigene Kopie, asynchrones Payment mit nachträglicher Benachrichtigung des Nutzers bei Fehler, kurze Timeouts für den Nutzer als Feedback.
    2. Kompatibilität: z.B. BC Break (Rückwärtskompatibilitätsbruch) in Library Update, Änderung von API Semantiken. Wichtig ist es, „sichere“ Packages zu wählen (Anzahl Entwickler, aktive Entwicklung, Anzahl Benutzer, Alternativen). Auch Semantic Versioning (semver) verspricht Kompatibilität (BC Break nur möglich, wenn sich die erste Versionsnummer ändert). Weiterhin helfen Tests, Lesen von Changelogs, Durchführung von Dry-Runs und Das einzelne updaten von Packages explizit (mit Abhängigkeiten aktualisieren funktioniert mit --with-dependencies).
    3. Compliance/Rechtliches: Fragestellung, ob Copy-Left Lizenz mit proprietärem Produkt vereinbar ist. Was gibt es laut Terms of Service zu beachten? Hier können composer licenses und der Private Packagist License Review helfen.

The more testing you doJeffrey McGuire & Sebastian Bergmann

„Je mehr du es tust, desto mehr wirst du es lieben“ – mit diesen Worten hat der Abschlussvortrag von Jeffrey und Sebastian begonnen. In der folgenden Dreiviertelstunde haben die beiden auf eine begeisternde Art und Weise erläutert, warum man testen sollte und was für Vorteile man dadurch hat.

  • Tests sind ein Kommunikationsmittel!
  • Tests sorgen für funktionierenden Code und qualitativ bessere Software. Man schafft dadurch Vertrauen bei bestehenden Kunden und kann potentielle neue Kunden überzeugen.
  • Test Driven Development dauert zwar länger, die Software wird dadurch aber besser, stabiler und wartbarer.
  • Tests machen glücklich! Psychologische Komponente!
  • Tests sind eine Investition in die Zukunft!
  • Tests als ausführbare Spezifikation (Tests before Code), Dokumentation und Verifikation
  • Die Hauptaufgabe eines Entwicklers ist nicht, so viel Code wie möglich zu schreiben, sondern Probleme zu erfassen und möglichst einfache Lösungen dafür zu bieten.

Abgerundet haben die beiden ihre Ausführungen durch die Vorstellung von Studien aus den letzten 15 Jahren – die Ergebnisse der Studien haben sich dabei direkt mit den vorherigen Punkten gedeckt: Je mehr Tests, desto besserer Code. Tests entwickeln kostet nur initial mehr Zeit, sorgt aber für stabileren Code und spart dadurch sogar langfristig eher Zeit. Iteratives Testen (also Coden, Testen, Coden, Testen) führt schneller zu verlässlichem Code. Langlebige und große Software profitiert immer und immer mehr von Tests je länger sie lebt, da durch die Testabdeckung gewährleistet ist, dass neue Funktionalitäten die bereits bestehende Codebasis nicht gefährden können, ohne dass es auffällt.

Als kleine, aber wichtige Randbemerkung hat Sebastian noch erwähnt, dass bereits die Urgesteine der Softwareentwicklung um 1950 zum Zeitpunkt der Mondlandung stark testgetrieben gearbeitet haben, weil sie es anlässlich der Kosten gar nicht anders kannten. Das allerdings wurde durch den Aufschwung der IT im privaten Bereich über die Jahrzehnte verlernt und Anfang der 90er als „Neuheit“ angepriesen. Wir sind mit der testgetriebenen Entwicklung somit wieder in die Fußstapfen unserer Großväter gestiegen und sollten es auch nie wieder vergessen.

Der Vortrag war ein fantastischer und sympathischer Abschluss des Konferenztages und wir freuen uns schon auf die nächste SymfonyLive im Oktober diesen Jahres in Berlin und die SymfonyCon in Rumänien, auf denen wir wieder am Start sein werden.

Bilder und Text: Fabian Bloching und Sinan Sözen

Anmerkung: Die hier verwendeten Fotos dürfen gerne kostenfrei verwendet werden! Wir freuen uns über eine Quellenangabe.

Berlin 2016

SymfonyCon Berlin 2016Recap vom 1. – 2. Dezember 2016 in Berlin

Nach der diesjährigen SymfonyLive in Köln fand nun auch die internationale SymfonyCon in Deutschland, genauer gesagt in Berlin, statt. Rund 1.200 Teilnehmer aus über 40 Nationen trafen sich Anfang Dezember in Berlin-Moabit und wurden vom Symfony-Erfinder Fabien Potencier auf die Konferenz eingestimmt.

Donnerstag, 1. Dezember 2016

Keynote „Symfony in the cloud“Fabien Potencier

Fabien gab in seiner Keynote „Symfony in the cloud“ einen kurzen Rückblick zu den Anfängen des Symfony Code-Deployments und den anstehenden Neuerungen in Symfony Version 3.2.

  • Workflow Komponente
  • Relative Pfade mit Symfony 3.2 vollständig umgesetzt
  • var/cache für Cache Dateien <> var/tmp für temporäre Dateien
  • Unterstützung für Read-Only-Filesysteme erleichtert Deployment & Cloud-Hosting

Do not (always) use FOSUserBundle!Damien Alexandre

Damien wies in seinem Vortrag auf die Problematik des weitverbreiteten Symfony Bundles hin. Vor allem die Tatsache, dass die Mehrzahl der User den Entwicklungsbranch dev-master setzt, stellt ein nicht unerhebliches Risiko dar. Für die meisten Funktionen des FOSUserBundles gibt es Standard Symfony Komponenten, die eine ähnliche Funktion bieten.

  • Aktuell dev-master am meisten genutzt, da stable nicht mit Symfony 3 kompatibel
  • Probleme:
    1. kein einfacher Wechsel von Nutzername + Passwort zu E-Mail + Passwort
    2. keine sonderlich aktive Entwicklung → stellt mögliche Sicherheitslücke dar
  • Es gibt Cookbooks für Standard Symfony-Komponenten die das FOSUserBundle ersetzen können
  • Datenbank-Collection ist case insensitive (dbcollection: _ci)

Seine Kriterien für die richtige Bundle-Auswahl sind:

  • Anzahl der beteiligten Nutzer
  • Abhängigkeiten und letzte Release
  • Lizenz

Learning: richtige Auswahl der Bundle über packagist.org

5 Years with SymfonyPaweł Jędrzejewski

Pawel berichtet über seine fünfjährige Erfahrung mit Symfony und teilt seine Erkenntnisse, die er in dieser Zeit gewonnen hat.

  • Gute Bundles recherchieren, bevor mit dem Code-Schreiben angefangen wird
  • Jedes Projekt braucht seine Zeit → deswegen auch bei Projekten für Familie und Freunde überlegen, ob genug Zeit dafür da ist.

Learning: Vorsicht mit Subrequests und Schleifen

Challenges and solutions in getting your open source company to contributionJeffrey A. McGuire

Jeffrey gab Einblicke in die Herausforderungen und Lösungen für Open Source Unternehmen.

  • Man kann die Welt nicht wirklich verbessern, aber man kann beispielsweise die Entwicklung von Drupal-Modulen vorantreiben.
  • "So what‘s the problem? – The developers perspective."
  • Wenn man seinen Code der Community zur Verfügung stellt, kann man von Verbesserungen anderer Teilnehmer profitieren. Nimmt man an bestehenden Projekten teil, kann man nicht nur das eigene Problem, sondern vielleicht auch das von anderen lösen

Learning: Ein Ziel von Open-Source-Verwendung: kein günstigeres, sondern ein besseres Produkt!

Knowing your state machinesTobias Nyholm

Tobias zeigt in seiner Präsentation „Knowing your state machines“ einen neuen Denkansatz zur Software-Strukturierung und -Entwicklung in Verbindung von endlichen Zustandsmaschinen. Mit anschaulichen Beispielen zeigte er auch die entsprechende Verwendung von Events und Security Voters.

  • "State Machine" sind neuartige Denkweisen
  • Die Komplexität wird vereinfacht und kann grafisch veranschaulicht werden
  • Symfony 3.2 unterstützt State Machines über die neue Workflow-Komponente

Abschließend fanden noch Lightning-Talks statt und beim Social-Event mit dem Motto „hipsterize Berlin“ traf man sich in lockerer Atmosphäre.

Freitag, 2. Dezember 2016

Der zweite Tag der SymfonyCon startete mit einer Vorstellung eines neuen Installers für Symfony – Symfony Flex in der zweiten Keynote „Symfony Distributions Reloaded“ von Fabien Potencier. Symfony Flex ermöglicht es, die Symfony-Installation individuell zu bestimmen und bietet mehr Flexibilität bei der Installation & Deinstallation von Bundles.

Soup up Symfony – Keep PHP Alive Between RequestsAndrew Carter

Weitere Optimierungsmöglichkeiten für bestehende Symfony-Installation stellte Andrew Carter in „Soup up Symfony – Keep PHP Alive Between Requests“ dar. Vor allem durch das Aufspüren von Memory Leaks kann Arbeitsspeicher auf den Live-Systemen gespart werden. Mit PHP-PM kann zudem recht einfach eine Entwicklungsumgebung aufgesetzt werden.

  • Symfony muss zwischen den Request aktiv gehalten werden
  • PHP-PM: Verwandelt Symfony in einen Server und kann zur Entwicklung verwendet werden
  • PHP Package Repository: phpfastcgi/speedfony-bundle
  • Potentielle Memory Leaks: FingersCrossedHandlers oder NoMoreLeaksBundle
  • Error Handling

Jenkins deployment pipelineNicole Cordes

Für einen modulareren Deployment-Prozess kann das CI-System Jenkins genutzt werden. Nicole Cordes stellte in „Jenkins deployment pipeline“ unterschiedliche Jenkins-Templates vor, die beim Ausspielen von einem Jenkins Jobs der Reihe nach aufgerufen werden können. Dadurch können einzelne Jobs für viele Deployment-Prozesse verwendet und die Redundanz somit reduziert werden. Weiterhin stellte sie einige nützliche Jenkins Plug-Ins vor.

Folgende Job-Pools werden empfohlen:

  • build: composer, node.js, asset management
  • test: phpunit, phplint, junit, behat, codeception
  • deploy: rsync, clear cache, warmup cache, database migration
  • tool: sonarQube, phpDocumentor

Empfehlungen:

  • Workspaces: build und test haben einen Workshop, deploy hat seinen eigenen
  • Einzelne Templates für jeden einzelnen Schritt anlegen: z. B. template-build-composer-install, template-test-phpunit
  • Pre-Build: Git checkout, tar und Artifakte archivieren, Build: untar und delete tar.gz
  • Nützliche Plugins: SCM Sync Configuration Plugin, Role-based Authorization Strategy, Workspace Cleanup Plugin

Fazit

Eine gut organisierte Entwickler-Konferenz mit spannenden Vorträgen. In unseren Augen waren drei Vorträge herausragend. Auch vom Hackday am Samstag lassen sich sehr interessante Gespräche & Denkanstöße mitnehmen.

Im Jahr 2017 findet die internationale SymfonyCon in Rumänien statt. Als Symfony-Liebhaber sind wir nächstes Jahr auf jeden Fall wieder auf der SymfonyLive und wahrscheinlich auch auf der SymfonyCon dabei.

Bilder und Text: Sebastian Blum und Daniel Potthast

Anmerkung: Die hier verwendeten Fotos dürfen gerne kostenfrei verwendet werden! Wir freuen uns über eine Quellenangabe.

Köln 2016

SymfonyLive Köln 2016Recap vom 29. April 2016 in Köln

SymfonyLive 2016 in Köln: das PHP Framework Symfony feiert die fünfte SymfonyLive und weicht aufgrund der SymfonyCon im Dezember dieses mal in die Domstadt aus. An einem Tag wurden zahlreiche Vorträge im KOMED MediaPark in Köln abgehalten. Wir waren dabei und präsentieren kurze Zusammenfassungen einiger ausgewählter Tracks.

KeynoteChristian Schäfer

Superhelden (Entwickler) im Porzellanladen – oder: wie finde ich das richtige Unternehmen für mich und was ist ein guter Job. Die wichtigsten Punkte: gutes Gehalt, Sicherheit, Spaß, Herausforderung und Perspektive.

Symfony Forms: Dos and Don’tsBernhard Schussek

  • Sinn der Form Komponente: „Einfache Dinge einfach umsetzen und komplexe Dinge möglich machen.“
  • Änderungen in der Form Komponente seit dem letzten Jahr sind z. B. FormType über configureOptions definieren, Flippings, choice_label / choice_value
  • Best Practices
    • Create Form über Custom FormType
    • Create FormType: Bei Hand erstellen
    • Form abschicken auf: Eigene Action verwenden
    • Werte an FormType über Options übergeben
    • Nutzung von Feature Flags
    • form_grid-x grid-padding-x verwenden um Reihenfolge zu bestimmen
    • Generell sollten keine Frontend Elemente im FormType verwendet werden
    • Assert in PHP Annotations vermeiden (Nützlich: PHP Autocomplete Plug-In in Symfony)
    • Expressions und Callbacks zur Validierung verwenden
    • Reihenfolge der Validierung über GroupSequences definieren
    • Value Objects, Data Transformers und Field Dependencies verwenden

Maßgeschneiderte TestdatenPhilipp Rieber – Vortrag auf Speaker Deck

Warum?

  • Testdaten zur Initialisierung einer Application und für automatisierte Tests
  • Früher direkt in Symfony eingebunden, jetzt im Doctrine Fixture Bundle

Faker (PHP library)

  • Laden von realistischen Test-Daten
  • Installation: fzaninotto/Faker
  • Zugriff auf unterschiedliche Wörterbücher und Muster in unterschiedlichen Sprachen (Provider)
  • Gleiche Daten über Seeding (für Tests) und Trait für PHPUnit

Alice

  • Installation: nelmio/alice
  • Ermöglicht Objekt-Ranges mit FakerFormatter
  • Mischen von unterschiedlichen Sprachen möglich

Symfony Integration
Verwendung eines Bundles von knplabs/rad-fixtures-load

Wie wir Code analyisierenKore Nordmann

  • Oft muss mit existierendem Code weitergearbeitet werden
  • Fokus bei der Code-Analyse: wichtiger, fehleranfälliger und schlecht getesteter Code
  • Qafoo QualityAnalyzer: Bewertung des Codes u. a. über Code Rank / Reversed Code Rank (Metrics) und Analyse der Klassen-Beziehungen
  • „Es gibt valide Gründe für jede Code-Zeile“

Modernisieren mit SymfonyAlexander M. Turek

  • Komplexer Einstieg in Projekte bei vorhandenen Legacy Anwendungen
  • Mögliche Lösung: Symfony vor Legacy Anwendung schalten und Teile nach und nach in Symfony überführen
  • Symfony verarbeitet alle Requests: Unbekannte Requests werden über die Legacy Anwendung abgewickelt
  • Auch die Authentifizierung und das Routing kann über Symfony abgewickelt werden

Bilder und Text: Sebastian Blum und Daniel Potthast

Anmerkung: Die hier verwendeten Fotos dürfen gerne kostenfrei verwendet werden! Wir freuen uns über eine Quellenangabe.

Berlin 2015

SymfonyLive Berlin 2015Recap vom 15. bis 16. Oktober 2015 in Berlin

SymfonyLive 2015 in Berlin: das PHP Framework Symfony feiert sein 10 jähriges Bestehen. An zwei Tagen wurden zahlreiche Vorträge im Golden Tulip in Berlin abgehalten. Wir waren dabei und präsentieren kurze Zusammenfassungen einiger ausgewählter Tracks.

Die Dokumentation Braucht Dich!Christian Flothmann

„Die Dokumentation braucht dich!“ lautete die Aufforderung von Christian Flothmann. Eine gute Dokumentation sollte eine Einstiegshilfe darstellen, verständlich, strukturiert, fehlerfrei und vollständig sein. Außerdem stellt sie ein zentrales Nachschlagewerk dar. Die Symfony Dokumentation kann von jedem Anwender direkt über GitHub korrigiert und verbessert werden. Bei der Suche nach fehlerhaften oder unvollständigen Einträgen hilft dabei die Filter-Funktion auf GitHub. Hier kann mit Hilfe von Labeln beispielsweise gezielt nach bereits gemeldeten Fehlern gesucht werden.

Decomposing PackagesBeau Simensen

Die Nutzung von Composer bringt zahlreiche Vorteile für die Entwicklung und Wartung von Webprojekten durch die Verwendung von Drittanbieter-Paketen. Allerdings kann es auch immer wieder vorkommen, dass Pakete nicht mehr aktualisiert und gewartet werden. Unter dem Titel „Decomposing Packages“ zeigte Beau Simensen neben den daraus resultierenden Sicherheitsrisiken auch passende Lösungsansätze auf wie beispielsweise ein eigenes Paketrepository für individuell angepasste Pakete.

Concurrency Control richtig implementieren mit DoctrineTobias Schultze

Der Symfony Core-Entwickler Tobias Schultze aus Zürich ging in seinem Vortrag sehr detailliert auf das Thema „Concurrency Control“ mit Doctrine ein und welche Probleme auftreten können. Am einfachsten ist es natürlich, die Datenbank zu sperren – das ist allerdings auch die langsamste Variante. Sobald gleichzeitige Zugriffe ermöglicht sollen, müssen die Sonderfälle im Code sehr sorgfältig geplant und behandelt werden.

Wie man sich auf PHP 7 vorbereitetSebastian Bergmann

Sebastian Bergmann, der Erfinder von PHPUnit, zeigte sehr detailliert, welche Neuerungen PHP 7 bringt. Im Gegensatz zu allen bisherigen PHP 7 Blogeinträgen & Präsentation veranschaulichte Sebastian, wieso genau diese Entscheidungen für Features in der PHP-Community getroffen wurden und was sie genau bezwecken. Im zweiten Teil ging es besonders um das Themengebiet Performancesteigung und den neuen PHP-Lexer und -Parser. Auch wenn unsere Assembler-Zeit schon etwas zurückliegt, die Bytecode-Beispiele mit Sebastians Erklärungen waren genial. Der Vortrag war wirklich die beste Zusammenfassung für den Einsatz von PHP 7.

Growing your FilesystemFrank de Jonge

Mit der Dateisystem-Abstraktion „Flysystem“ zeigte Frank de Jonge eine einfache, flexible und dennoch leistungsstarke Möglichkeit einen einheitlichen Adapter für unterschiedliche Dateisysteme zu verwenden. Dabei werden die unterschiedlichsten Speicherorte bereits jetzt unterstützt, z. B. AWS S3, Dropbox, FTP, aber auch das Ablegen in den Arbeitsspeicher ist möglich. Sollte der Ort zu einem späteren Zeitpunkt geändert werden, muss nur die Konfiguration angepasst werden.

Doctrine 2: To Use or Not to UseBenjamin Eberlei

Der Doctrine-Core-Entwickler Benjamin Eberlei zeigte in seinem Vortrag „Doctrine 2 – to use or not to use“ sehr ausführlich, welche Vorteile Doctrine insbesondere im Zusammenspiel mit Symfony-Formularen und Symfony-Validierung bringt und dass für 80% der Anwendungsfälle Doctrine sehr gut geeignet ist. Aber nach der 80/20 Regel gibt es auch viele Szenarien, wo der Einsatz von Doctrine an seine architektonischen Grenzen stößt und Datenbank-Operationen auf Basis des DBAL sinnvoller sind. Kurzzusammenfassung: Der Einsatz von ORM benötigt Arbeitsspeicher, Flush kann eine Vielzahl von Datenbank-Queries absetzen, Doctrine-Events sollten wenn möglich nicht eingesetzt werden und Batch-Prozesse direkt auf Basis von DBAL erfolgen.

10 Jahre Symfony

Stolz blickte Fabien Potencier zur Eröffnung der diesjährigen SymfonyLive in Berlin auf die Anfangszeiten des erfolgreichen PHP-Frameworks zurück. Sein erster Commit umfasst damals nur wenige Dateien, unterstützte jedoch bereits mit der enthaltenen Batch-Datei Microsofts Windows. Zehn Jahre geht die Entwicklung von Symfony mit den Versionen 2.8 und 3.0 konsequent vorwärts. Beide Versionen sind sich sehr ähnlich und unterscheiden sich nur in ihrer Abwärtskompatibilität.

Puli: PHP’s Next Package RevolutionBernhard Schussek

Bernhard Schussek, ein Symfony-Core-Entwickler und Spezialist für Symfony-Forms, ist zeitgleich auch Core-Entwickler von Puli, einer universellem Paketplattform für PHP Microservices. Derzeit gibt es eine Vielzahl von Framework unabhängigen PHP-Bibliotheken, aber auch sehr viele Framework-abhängige Bundles, Modules oder Plugins. Puli hat das Ziel, universelle Pakete Framework übergreifend anzubieten, damit die Bibliotheken ohne Framework-Integration genutzt werden können. Am Beispiel von Twig als Bibliothek zeigt sich, dass die Integration für Symfony mit dem TwigBundle, für Zend mit dem TwigModule und für andere Frameworks derzeit mit den jeweiligen Adaptern realisiert wird, das zukünftig Puli komplett übernehmen könnte.

HTTP/2.0 101 IntroductionBastian Hofmann

Bastian Hofmann zeigte in seinem Vortrag zum Thema „HTTP/2.0 101 Introduction“ die Unterschiede von HTTP/1.1 zu HTTP/2.0 auf und stellte auch die daraus resultierenden Vorteile von HTTP/2.0 vor. Der Hauptaugenmerk liegt vor allem auf deutlich geringere Ladezeiten, um dem Nutzer ein angenehmeres Surfen zu ermöglichen und Besucher nicht schon frühzeitig aufgrund zu langer Wartezeit zu verlieren. Die Umstellung wird auch für das mobile Surfen für deutlich niedrigere Ladezeiten sorgen und ist daher doppelt interessant. Zwar sind die Module für die Webserver NGINX und Apache noch nicht komplett ausgereift, für Interessierte lohnt es sich dennoch schon jetzt einen Blick darauf zu werfen.

Let‘s automate stuff with AnsibleSebastian Göttschkes

Wer seine IT durch Automatisierung beschleunigen und vereinfachen will, sollte laut Sebastian Göttschkes einen Blick auf Ansible werfen. Diese Lösung bietet gegenüber Chef und Puppet den Vorteil, dass sie ohne komplexe Konfiguration auskommt und somit für Einsteiger leichter zugänglich ist. Auch wird kein Agent auf dem Zielsystem benötigt, da eine direkte SSH-Verbindung hergestellt wird. Gesteuert wird die Automatisierung über in YAML geschriebene Konfigurationsdateien mit Templates, Rollen und unterschiedlichen Entwicklungsumgebungen.

„Working with a single, scary, big VCS repository“Benjamin Eberlei

Der letzte Vortrag von Benjamin Eberlei widmete sich dem Thema Monorepo – ein großes monolithisches Repository für alle Projekte. Mit Hilfe von Paketmanagern wie npm oder composer für PHP ist es mittlerweile sehr einfach, eine Vielzahl von Komponenten in bestimmten Versionen zu integrieren und damit zu arbeiten. So haben sich vor allem auf GitHub sehr viele kleine Git-Repositories und einzelne Komponenten gebildet. Während es für Open-Source-Projekte durchaus Sinn macht, viele unterschiedliche Versionen einer Komponente bereitzustellen, sieht es für Anwendungen eines Unternehmens anders aus. Mit einem Monorepo – wie es Google, Facebook oder Symfony einsetzen – gibt es immer nur eine Version der Komponenten und Updates an Komponenten müssen in allen Anwendungen aktualisiert werden, so dass kein zukünftiger Upgrade-Aufwand für andere Entwickler entstehen kann. Zudem sind anwendungsübergreifende Feature-Branches genauso möglich wie auch Feature-Merges über alle Anwendungen hinweg. Alle Komponenten sind in einem Commit sichtbar, wodurch erkennen die Entwickler sämtliche Abhängigkeiten und die Auswirkungen ihrer Änderungen sofort erkennen können. Es wurde in dem Vortrag auch deutlich, wieso Symfony mit allen Komponenten ein monolithisches Repository verwendet und es erst im zweiten Schritt für die Komponenten bei Releases in einzelne Pakete und Repositories aufteilt.

Die diesjährige Veranstaltung konnte wieder mit sehr guten Vorträgen aufwarten, welche den Symfony-Alltag bereichern werden. Wir freuen uns auf nächstes Jahr!

Bilder und Text: Sebastian Blum und Daniel Potthast

Anmerkung: Die hier verwendeten Fotos dürfen gerne kostenfrei verwendet werden! Wir freuen uns über eine Quellenangabe.