© rudall30/Shutterstock.com
Phalcon: Performant, robust, geschrieben in C

Der Falke unter den PHP Frameworks


Phalcon ist ein noch eher unbekanntes, inzwischen aber ausgereiftes PHP Framework, das von Version zu Version mächtiger wird. Höchste Zeit, den Falken etwas genauer unter die Lupe zu nehmen!

Wir befinden uns im Jahr 2011. Gerade ist die erste Version des Laravel-Frameworks erschienen. Im selben Jahr brütet ein gewisser Andrés Gutiérrez über einer Idee für eine neue Art von Webframework: Extrem performant soll es sein, praxisnah und voller nützlicher Features.

In einem Interview aus dem Jahr 2015 [1] erklärt Gutiérrez, er habe zunächst versucht, dieses Framework in Sprachen wie Go, Rust oder C zu schreiben – ohne Erfolg. Erst als er einen neuen Anlauf mit PHP unternimmt, erhält er die gewünschten Resultate. Zu diesem Zeitpunkt hat Andrés neun Jahre Erfahrung in Unternehmen bei der Entwicklung von personalisierten Web-Frameworks und beschäftigt sich ausgiebig mit den Konzepten, Design Patterns und Paradigmata von PHP. In einem späteren Interview von 2016 [2] rät er dazu, sich die Seite https://phptherightway.com [3] anzuschauen, um zu einem echten PHP-Guru zu werden.

Geburt des Frameworks

Um das schnellstmögliche PHP-Framework zu entwickeln, hatte Andrés die Idee, eine PHP-Erweiterung statt einer High-Level-Abstraktion zu schreiben. Auf diese Art und Weise sollte das Framework tief in der DNA von PHP verwurzelt werden. Da PHP-Erweiterungen genauso wie die Sprache PHP selbst in C geschrieben sind, mussten also Programmierkenntnisse in C vorhanden sein. Ausgehend von diesem Prinzip veröffentlichte Andrés eine erste Version namens Spark, die komplett in C verfasst war. Mit diesem Proof of Concept konnte er eine Gruppe von begeisterten Mitstreitern überzeugen, ein komplettes Framework zu entwickeln.

Die Gruppe entschied sich für den Namen Phalcon – ein Wortspiel aus PHP und dem englischen Falcon. Nach einer intensiven Arbeitsphase erschien im November 2012 eine erste Betaversion 0.4.5 des Frameworks.

Die Geburt von Zephir

Bei der Programmierung dieser ersten Version wurden sich die Entwickler eines Problems bewusst: Nur wenige Entwickler zeigten sich bereit, ein Framework in C zu schreiben. Um diesem Umstand zu begegnen, hatte die Gruppe eine weitere Idee: Wie wäre es, eine Sprache zu haben, die syntaktisch nahe an PHP angelehnt ist, aber darauf spezialisiert, Erweiterungen in C zu schreiben? Als Ergebnis dieses Gedankenspiels kam 2013 die Sprache Zephir zur Welt. Die Version 2.0 des Phalcon-Frameworks wurde daraufhin komplett in Zephir geschrieben, wie auch alle weiteren Versionen danach.

Zephir hat sehr zur Popularität von Phalcon beigetragen. Die Community vergrößerte sich und es wurde einfacher, Beiträge zu Phalcon zu leisten. Zephir wird mittlerweile auch von anderen Projekten genutzt: Viele performante Erweiterungen für Unternehmensanwendungen sind bereits entstanden.

Um einen ersten Eindruck der Syntax von Zephir zu erhalten, werfen wir einen Blick auf den Quellcode von Phalcon. Listing 1 zeigt eine Funktion, die die Zugriffsrechte auf verschiedene Seiten eines Webprojekts verwaltet.

Listing 1

/**  * Adds a role to the ACL list. Second parameter allows inheriting * access data from other existing role  *  * ```php  * $acl->addRole(  * new Phalcon\Acl\Role("administrator"),  * "consultant"  * );  *  * $acl->addRole("administrator", "consultant");  * $acl->addRole("administrator", ["consultant", "consultant2"]);  * ```  */ public function addRole(role, accessInherits = null) -> bool { var roleName, roleObject; if typeof role == "object" && role instanceof RoleInterface { let roleObject = role; } elseif is_string(role) { let roleObject = new Role(role); } else { throw new Exception( "Role must be either a string or implement RoleInterface" ); } let roleName = roleObject->getName(); if isset this->rolesNames[roleName] { return false; }

Im Vergleich zu PHP sieht man einige kleine Unterschiede:

  • Um den Rückgabewert einer Funktion zu erhalten, wird das Pfeilzeichen verwendet.

  • Die Definition einer Variablen geschieht mit dem Schlüsselwort var.

  • Das Schlüsselwort erlaubt es, definierten Variablen Werte zuzuweisen.

  • Das Zeichen $ nach this entfällt.

Abgesehen von diesen Abweichungen handelt es sich um traditionelles PHP.

Phalcon heute

Die neueste Version von Phalcon ist 4.0.6 vom 16. Mai 2020. Zephir ist am 13. Mai 2020 in der Version 0.12.19 erschienen. Am 11. November 2019 wurde Phalcon offiziell in den berühmten PECL-Katalog (PHP Extension Community Library) aufgenommen. Dadurch ist es jetzt noch einfacher, Phalcon zu installieren. Phalcon und Zephir haben sich beide seit ihren ersten Versionen sehr stark weiterentwickelt. Wir wollen im Folgenden die zentralen Funktionalitäten des aktuellen Phalcon Frameworks genauer beleuchten. Los geht’s!

Die Funktionalitäten von Phalcon

Phalcon wird wie eine Extension installiert. Alle Ordner, aus denen Phalcon zusammengesetzt ist, werden in einem einzigen Ordner kompiliert. Allerdings muss Phalcon in einer bestimmten Version kompiliert werden, um mit dem jeweiligen System (32/64 Bit), der jeweiligen PHP-Version und dem verwendeten Betriebssystem zu funktionieren. Die Kompilierung bringt zahlreiche Vorteile mit sich:

  • Der gesamte Code wird analysiert. Tritt ein Fehler auf, wird die Kompilierung angehalten. Das stellt im Vergleich zu interpretiertem Code eine erhöhte Stabilität sicher.

  • Der Code wird komprimiert. Dadurch wird er schlanker und einfacher zu installieren. Anstatt eine Vielzahl von verschiedenen Ordnern einzusammeln, wie es andere Frameworks tun, genügt das Copy-Paste einer .dll oder eines .so-Ordners.

  • Die Erweiterung ist für eine spezifische Architektur optimiert.

  • Da Phalcon auf einem Webserver installiert ist, können alle Anwendungen es benutzen.

  • Ab dem Zeitpunkt, da der Daemon des Webservers startet, sind die Klassen und Funktionen von Phalcon verfügbar.

Über die genannten Vorteile hinaus konsumiert Phalcon wenig Speicher und CPU. Wer sich genauer informieren möchte, dem sei der Benchmarktest unter [4] ans Herz gelegt.

MVC-Architektur

Abbildung 1 zeigt das Grundgerüst eines Phalcon-Projekts. Man erkennt dabei gut die gängige MVC-Architektur mit den Ordnern für Models, Views und Controllers. Der Ordner config erlaubt es, bestimmte Parameter, Services, Pfade und Namensräume zu setzen. Über das Verzeichnis migrations lassen sich Datenmigrationen von SQL-Datenbanken durchführen. Der Ordner public enthält die statischen Ressourcen (JavaScript, Bilder, CSS etc.). Schließlich liegen im Cache-Verzeichnis die von der Volt/Phtml-Rendering-Engine erzeugten PHP-Dateien.

pastouret_phalcon_1.tif_fmt1.jpgAbb. 1: MVC-Architektur von Phalcon

Das REST API

Es ist einfach, ein API mit Phalcon zu entwickeln. Es genügt, mit phalcon-devtools ein Projekt des Typs Micro zu erzeugen. Listing 2 zeigt ein einfaches Beispiel-API mit Phalcon.

Listing 2

$app = new Micro(); $app->get('/', function () { return $this->response->setJsonContent( [ 'status' => 'Tout fonctionne', ] ); } ); $app->notFound(function () use($app) { $app->response->setStatusCode(404, "Not Found")->sendHeaders(); }); $app->handle($_GET['_url'] ?? '/');

Mit der Klasse Micro ist es möglich, Pfade mit ihren assoziierten Funktionen zu erzeugen. Das GET kann natürlich durch andere API-Methoden wie POST oder PUT ersetzt werden. Es ist auch möglich, unbekannte Pfade zu generieren (z. B. 404-Fehler).

Das Kommandozeilen-Interface: CLI

In den meisten Projekten müssen bestimmte Aufgaben im Hintergrund erledigt werden, und das aus mehreren Gründen:

  • Lange andauernde Arbeiten, während derer der Entwickler etwas anderes tun kann und per E-Mail oder Notification informiert wird, wenn die Arbeit erledigt...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang