Wer sich mit PHP eine Website zimmern möchte, freut sich über die große Zahl an vorfertigten Rahmenwerken. Das Linux-Magazin prüft Funktionsumfang und Komfort der besten Frameworks .
Wie erfahrene Zimmerleute setzen auch PHP-Entwickler auf fertige Formteile, um das Gerüst eines neuen Projekts aufzustellen. Frameworks sparen Zeit und duplizierten Code. Doch vor dem virtuellen Hammerschwingen steht das Suchen der geeignetsten Umgebung.
Große Resonanz
Bis etwa 2005 gab es kaum Allzweck-Frameworks für die beliebte Websprache jenseits des Angebots von Zend, der PHP-Firma der ersten Stunde. Vorbilder aus der Java-Welt stießen in der Community auf wenig Gegenliebe. Als jedoch 2004 Rails die handliche Skriptsprache Ruby um ein Webframework erweiterte, war die Resonanz in der PHP-Welt groß. Auch viele PHP-Entwickler erlagen dem Charme des Rapid Application Development (RAD).
Die PHP-Szene ist trotz der zentralen Stellung der Firma Zend nicht hierarchisch organisiert und zudem riesengroß. Daher fühlten sich bald viele dazu berufen, Rails-ähnliche Frameworks für PHP zu entwickeln. An die hundert Projekte finden sich im Internet, die die wenig aussagekräftige Bezeichnung Framework tragen. Wer auf der Suche nach einem für sein Projekt und seinen Programmierstil geeigneten Angebot nichts verpassen möchte, sollte mindestens Cake PHP, Codeigniter, Kohana, Prado, Symfony, Yii und das Zend Framework in Betracht ziehen (siehe Tabelle 1).
|
Tabelle 1: |
|||||||
|---|---|---|---|---|---|---|---|
|
Kategorie |
CakePHP [1] |
Codeigniter [2] |
Kohana [3] |
Prado [4] |
Symfony [5] |
Yii [6] |
Zend Framework [7] |
|
Version |
1.2.4.8284 |
1.7.1 |
2.3.4 |
3.1.6 |
1.2.8 |
1.0.8 |
1.9.1 |
|
Lizenz |
MIT |
BSD-artig |
BSD-artig |
BSD-artig |
MIT |
BSD-artig |
BSD-artig |
|
Freshmeat-Popularity |
195.16 |
nicht gelistet |
49.05 |
194.98 |
165.29 |
234.14 |
97.72 |
|
Ohlo-Users |
885 |
80 |
58 |
15 |
173 |
17 |
254 |
|
Ohlo-User-Rating |
4,5/5 (269 Stimmen) |
4,5/5 (36 Stimmen) |
4,7/5 (29 Stimmen) |
4,1/5 (12 Stimmen) |
4,4/5 (75 Stimmen) |
4,9/5 (8 Stimmen) |
4.0/5 (122 Stimmen) |
|
Codeumfang nach Ohloh.net (Mannjahre Entwicklungszeit) |
84 Mannjahre |
9 Mannjahre |
6 Mannjahre |
70 Mannjahre |
796 Mannjahre |
45 Mannjahre |
752 Mannjahre |
|
Funktionsumfang |
* * * * |
* * |
* * * |
* * * * |
* * * * * |
* * * * |
* * * * * |
|
Ohloh-Codeanalyse |
großes, aktives Entwickler-Team; etablierte Code-Basis; |
etablierte Code-Basis; zahlreiche Code-Kommentare; über |
sehr großes, aktives Entwickler-Team |
etablierte Code-Basis; zahlreiche Code-Kommentare; über |
sehr großes, aktives Entwickler-Team; über die Jahre |
kurze History des Code-Repositories; wenig Kommentare im Code; |
sehr großes, aktives Entwickler-Team; zahlreiche |
Vorauswahl
Auch diese sieben Frameworks lassen sich aus vielen Blickwinkeln evaluieren, der Artikel greift daher die archetypischen Vertreter heraus: Er schließt Cake PHP und Prado als Frameworks mit abnehmender Entwicklungsaktivität aus und wählt von den verbleibenden fünf die drei interessantesten: Yii gilt als Shootingstar, ist performant und bei seinen Anwendern beliebt. Symfony hat eine große Community und ein großes Entwicklerteam. Das Zend Framework ist im Unternehmensumfeld klar die Nummer 1 und hat, wie schon ein Blick in das Inhaltsverzeichnis der Dokumentation zeigt, mit Abstand den größten Funktionsumfang. Kerneigenschaften der restlichen Frameworks fasst der Kasten “Die Alternativen” zusammen. Auch darüber hinaus gibt es Dutzende weiterer Projekte, die aber oft nur funktionale Nischen füllen.
|
Die Alternativen |
|---|
|
Cake PHP war eines der ersten leistungsfähigen PHP-Frameworks, hat aber in den letzten zwei Jahren etwas an Zugkraft eingebüßt. Es unterstützt noch PHP 4, sein Quellcode muss daher ohne private Methoden und Attribute auskommen. Umfang und viele Konzepte ähneln dem Newcomer Yii, können sich aber mit dessen Performance nicht messen. Prado ist kein MVC-Framework, sondern setzt auf Event-gesteuerte Programmierung: Der Controller als Bindeglied zwischen Model und View entfällt, dafür registriert der Entwickler Eventhandler direkt im Page-Template, der Entsprechung zur View. Der Codeschnipsel »<com:TButton Text=”Save” OnClick=”saveButtonClicked” />« im Page-Template ruft automatisch die Callback-Funktion »saveButtonClicked()« auf [28]. Codeigniter ist Favorit des PHP-Schöpfers Rasmus Lerdorf: “Es ist schneller, leichtgewichtiger und fühlt sich am wenigsten wie ein Framework an”, sagte er auf der Froscon 2008. Als dem einzigen vorgestellten Framework fehlt Codeigniter ein Object Relational Mapper (ORM). Kohana startete im Mai 2007 als Fork von Codeigniter, doch schon ein halbes Jahr später schrieben es seine Entwickler für die Version 2.0 von Grund auf neu. Von Codeigniter blieb die hohe Gewichtung der Geschwindigkeit, mit der es Seiten ausliefert. Mit Version 2.1 ist ein ORM hinzugekommen. Um übersichtlicher zu werden, unterstützen seine Macher seither HP 4 nicht mehr. Dazu entfernten sie älteren Code, der noch die bei PHP 4 erforderliche Klassensyntax ohne Konstruktoren und vollwertige Kapselung enthielt. |
Yii
Ohloh.nets Codeanalyse stellt Yii keine gute Noten aus (siehe Tabelle 1): Nur eine kleine Entwicklergemeinde und dürftig kommentierter Code, so kritisiert das Entwicklerportal. Dennoch finden sich im Internet zahlreiche Stimmen, die den Newcomer als Fortschritt gegenüber etablierten Frameworks werten. Bei der Anwendergunst liegt es dann bei Ohloh und bei Freshmeat auf Platz eins. Hauptentwickler ist Qiang Xue, der Initiator des Prado-Projekts, aus dessen Team er sich zurückgezogen hat.
Ein handfester Vorteil ist, dass Yii für Ajax-Funktionen auf die neue Javascript-Bibliothek Jquery setzt [8]. Durch ihre eingängige Syntax, ihren Funktionsumfang und gute Dokumentation hat sie Veteranen wie Prototype und Scriptaculous [9] sowie selbst Yahoos weit umfangreichere Interface-Library [10] inzwischen an die Wand gespielt. Zwar kapseln die Frameworks die Javascript-Bibliothek, sodass der Entwickler zunächst nicht direkt mit Javascript in Kontakt kommt. Entwickler sollten aber bedenken, dass sich komplexere Ajax-Funktionen meist nicht mit dem per Kapselung bereitgestellten Funktionsumfang bestreiten lassen.
Folgender PHP-Code erzeugt in einem Yii-View-File ein Autocompletion-Textfeld:
<?php $this->widget(
'CAutoComplete', array('name'=>'username',
'url'=>$this->createUrl(
"autocomplete/autocomplete"),
)
);
?>
PHP-Code erscheint oft als ein Fremdkörper in Dateien, wenn sie sowohl HTML als auch Teile der View-Programmlogik enthalten. Das gilt besonders, wenn auch Anwender ohne Programmierkenntnisse sie bearbeiten. Yii enthält daher eine einfache Template-Engine, deren XML-Syntax sich bruchloser in HTML einfügt:
<com:CAutoComplete name="username" url='http://$this->createUrl(autocomplete/autocomplete)'/>
Der Template-Code wirkt lesbarer, Schreibarbeit spart diese auf Anwendungsebene aktivierbare Syntaxvariante aber nicht. Dafür beeinträchtigt sie auch die Performance wenig, da Yii den Template-Code in PHP-Code übersetzt und bis zur nächsten Änderung am Template zwischenspeichert. Die Yii-Klasse »CViewRenderer« definiert außerdem das Interface »IViewRenderer«, sodass sich durch Ableitungen von dieser Klasse leicht Template-Engines wie Smarty [11] einbinden lassen.
Dieses Detail zeigt: Der Yii-Code ist, wie Ohloh.net anmahnt, knapp und für Einsteiger nicht immer leicht verständlich kommentiert. Mit dem Interface an einer typischen Stelle für Erweiterungen erweist er sich dennoch als gut durchdacht. In MVC-Umgebungen stehen sich Model und View paarweise gegenüber. Manchmal, zum Beispiel bei Cake PHP, sind sie durch ein Namensschema verknüpft. In Yii dagegen ruft der Controller eine View explizit durch »$this->render(View-Name)« auf.
Es bleibt in Yii nicht bei der Paarrelation: Das Widget aus dem ersten Beispiel ist nichts anderes als eine in eine View eingebettete Unter-View. Fakultativ gliedert ein separater Controller die Anwendungslogik aus. Mit Hilfe von Widgets lassen sich dynamische Anzeige-Elemente wie Menüs oder Datumswähler bequem an mehreren Stellen der Site platzieren.
Die Methode »createUrl()« im Beispiel erzeugt aus dem Controller-Namen und der in der Controller-Klasse aufzurufenden Methode (Action) einen absoluten Pfad. Dieser ließe sich auch fest einstellen, doch Yii unterstützt neben dem Standard-URL-Mapping »Webroot/index.php/Controller/Action« auch flexibel konfigurierbare Pretty-URLs. »createURL()« erzeugt auch bei wechselnder Konfiguration stets den richtigen Pfad.
Noch mehr Dynamik
Das Model-View-Controller-Designpattern sieht vor, dass ein per URL adressierter Controller dynamisch erzeugten Code an vorgesehene Stellen in einer View platziert. Diese Verknüpfung zwischen Model und View legt der Code fest, daher bleibt sie zur Laufzeit statisch. Erst ab PHP 5.3 lassen sich Methodenaufrufe über Variablen dynamisch nach dem Muster »Klasse->$Variable()« gestalten. Das schadet aber oft der Lesbarkeit.
Yii führt stattdessen ein Webentwicklern von Javascript her bekanntes Konzept ein, nämlich Events: Sie akzeptieren zur Laufzeit Methodennamen als Callback-Funktionen, so genannte Eventhandler. Löst der Aufruf »$Komponente->raiseEvent(‘Eventname’, Parameter)« ein Ereignis aus, so führt Yii alle zu diesem Zeitpunkt mit »$Komponente->Eventname=$Callback« registrierten Handler aus. Die Anwendungsstruktur, die sich so ergibt, ähnelt variablen Steckverbindungen, nicht mehr einer fest verlöteten Platine.
Komponentenbauweise
Es fehlt noch die Erklärung, was hinter »$Komponente« im obigen Beispiel steckt: Komponenten stehen in Yii für Klassen, die sich anwendungsweit oder sogar anwendungsübergreifend wiederverwenden lassen. »$Komponente« steht für eine Instanz einer von »CApplicationComponent« abgeleiteten Klasse. Eventhooks erlauben es, an Komponenten wechselnde Funktionen anzudocken. So lassen sie sich flexibler gestalten und damit besser wiederverwenden als Klassen, die ausschließlich auf unveränderliche Methoden setzen.
Doch dies ist nicht alles: Für noch mehr Flexibilität sorgen die so genannten Behaviors, das zweite Charakteristikum einer Yii-Komponente. Sie setzen das Designpattern Mixin [12] um, mit dem sich – ohne den bestehenden Code anzutasten – einer bestehenden Klasse neue Methoden hinzufügen lassen, um etwa Persistenzfunktionen einzubauen.
Yii bezeichnet sich selbst als “full featured”. Tatsächlich wirkt der Funktionsumfang rund: Neben einer ausgefeilten MVC-Struktur bietet Yii wie Rails einen auf Active-Records basierenden Object Relational Mapper für die Datenbankanbindung. Da er auf den PHP Data Objects (PDO) aufsetzt, unterstützt Yii alle Datenbanken, für die auf dem Webserver ein PHP-PDO-Treiber installiert ist. Zurzeit gibt es sie für MySQL, PostgreSQL, Oracle, SQLite, IBM-DB, Firebird, den Microsoft SQL Server, Informix und für die ODBC-Schnittstelle.
Grundlegendes Handwerkszeug bringt Yii mit: Das Framework cacht und hilft beim Internationalisieren. Über eine Erweiterungsschnittstelle stellt die Community interessante Module bereit. Die kümmern sich etwa um Ajax-Effekte, eine rudimentäre Webservice-Schnittstelle sowie Logging und Fehlerbehandlung. Ein Kommandozeilen-Tool, das einen Anwendungsprototyp mit Create-, Read-, Update- und Delete-Funktionen (CRUD) für ein definiertes Datenmodell erzeugt, gibt es auch.
Ohne ein vorgegebenes Datenmodell erzeugt diese Scaffoldung genannte Technik in Yii ein Projekt mit mehreren View-Controller-Paaren und einer Benutzerauthentifikation (Abbildung 1), die den Einstieg in die Yii-Entwicklung erleichtert. Cake PHP und Symfony bieten an dieser Stelle etwas mehr, doch auch bei ihnen entstehen praxistaugliche Anwendungen nicht auf Knopfdruck.

Abbildung 1: Der Yii-Anwendungsgenerator erzeugt ein Webprojekt mit drei Unterseiten, Benutzerauthentifizierung und einem Spamschutz mit Captcha.
Passkontrolle für Daten
Das Yii-Paket »system.validators« stellt ein umfassendes Instrumentarium zum Prüfen von Benutzereingaben bereit. Es untersucht numerische Werte oder Strings und URLs, bietet aber auch Captchas an, um Spamroboter auszusperren. Besonders hervorzuheben ist, dass Yii den renommierten Htmlpurifier [13] einbindet, der feingranular konfigurierbar HTML- oder Javascript-Elemente per Whitelist aus Benutzereingaben entfernt. Bei konsequentem Einsatz sind Yii-Anwendungen damit gegen Cross-Site Scripting gefeit.
Jeder gute Webentwickler ist sich inzwischen der Gefahr von XSS-Attacken bewusst. Leider gilt dies weniger für das im Kasten “Cross-Site Request Forgery” beschriebene Verfahren. Auf Wunsch fügt Yii als Gegenmaßname in jedes mit der Helferklasse »CHtml::form« erzeugte Formular ein verstecktes Feld mit einem Zufallswert ein, den es in einem Cookie speichert. Der Aufruf der »POST«-Methode mit einem untergeschobenen Formular scheitert dann. Schade, dass man diesen Schutz in der Anwendungskonfiguration erst aktivieren muss.
|
Cross-Site Request |
|---|
|
Bei diesem Angriff auf Webseiten platziert der Angreifer eine URL in einer Website und antizipiert, dass sein Opfer auf den Link klickt. Daraufhin führt der Anwender – aus Sicht des Angreifers vorzugsweise aus einem privilegierten Kontext heraus, etwa innerhalb einer authentisierten Sitzung – eine Aktivität aus, die der Angreifer ohne Authentisierung nicht auszuführen vermag. Gelingt es dem Angreifer, in einem authentifizierten Kontext eine winzige Grafik mit dem Code »<img src=”http://Ihre-Bank/portal.php?transaktion=ueberweisen&summe=3000&an=mich_natuerlich”>« einzufügen, dann ist ein erkleckliches Sümmchen ohne einen einzigen Klick weg, entsprechende Inkompetenz der Bank vorausgesetzt, die ihrerseits zusätzliche Tests einfügen sollte. Vom Angreifer kontrolliertes Javascript löst Post-Requests auch ohne Benutzerinteraktion aus, indem er zum Beispiel zuerst dynamisch ein Formular in das aktuelle Dokument schreibt oder die Zieladresse eines bestehenden verändert. Anschließend simuliert »document.Formularname.submit()« einen Klick auf den Absendeknopf. |
Faulheit macht schnell
Ein Hauptargument für Yii ist seine Performance: Ob die Zahlen wirklich so eindeutig zugunsten von Yii ausfallen, wie in dem vom Yii-Entwickler durchgeführten Benchmark [14], ist zweifelhaft: Der dort ausgeführte Code bricht, allerdings nicht nur im Yii-Code, mit einem »die()«-Befehl ab, was einem Ausschalten des Computers ohne Herunterfahren des Systems gleichkommt. Yii-Projektleiter Qiang Xue versucht mit dem Benchmark zu messen, wie viel Overhead das Laden der Framework-Klassen erzeugt, bevor sie den eigentlichen Anwendungs-Code ausführen [15].
Hier schneidet Yii durch sein Lazy-Loading-Konzept gut ab, denn es lädt jede Yii-Klasse erst dann, wenn der Code sie braucht. Das ist ein Faktor der Performance von Frameworks – aber eben nur einer von mehreren. Daniel Carreras Benchmark [16] misst die Zahl ausgelieferter Seiten, wenn eine Datenbank angebunden ist. Auch hier punktet Yii.
Die Dokumentation von Yii ist verständlich und erläutert den größten Teil des Framework nachvollziehbar. Im Forum erhalten Fragende schnelle und umfassende Auskünfte, oft vom Hauptentwickler selbst. Wer den vollen Funktionsumfang kennenlernen möchte, muss die automatische Klassenreferenz durchstöbern, die aber Methoden manchmal nur mit einem Satz erläutert. Was der Neuling schmerzlich vermisst, sind Quellcode-Beispiele. Zwar finden sich im Yii-Cookbook an die 40 Erläuterungen für spezielle Problemstellungen, die auch mit Code belegt sind, doch sie decken bisher erst einen geringen Prozentsatz der typischen Neulingsfagen ab.
Symfony
Symfony unterscheidet sich ebenso wie das Zend Framework stark von Yii und Cake PHP, wenn man die in die Projekte geflossenen Entwicklungszeiten betrachten: Nach der Ohloh.net-Analyse kommt Symfony auf 796 Entwicklerjahre, Zend auf 752, Yii dagegen nur auf 45, Cake PHP auf 84. Seine Fähigkeiten, die Entwicklung durch automatisch erzeugten Code zu beschleunigen, gehen weiter als in Yii. Lässt sich Yii mit einem getunten Sportwagen vergleichen, so ist Symfony die komfortable Limousine unter den Webframeworks.
Schon die Dokumentation gibt sich luxuriös (Abbildung 2): Sie umfasst sechs Tutorials, eines davon vom Lead-Entwickler Fabien Potencier. Das ursprünglich als Weihnachtskalender herausgegebene Jobeet-Tutorial behandelt die Grundlagen lückenlos in 24 Lektionen.

Abbildung 2: Symfony glänzt nicht nur mit einem großen Funktionsumfang, sondern auch mit viel Dokumentation. In 24 einstündigen Lerneinheiten weisen die Jobeet-Tutorien den Webadmin in wichtige Themen ein.
Viel Startkapital
Neben den Tutorials gibt es ein Handbuch für die in Symfony sehr wichtigen Konfigurationsdateien, das Event-System und das Kommandozeilen-Tool. Auch dies leistet bei der Software etwas mehr als die Gegenstücke der Konkurrenz. So erzeugt es beispielsweise die Datenbank aus einer Model-Definition.
Symfonys Reference Book besteht aus einer mit vielen Beispielen illustrierten FAQ-Sammlung. Gesonderte Handbücher gibt es für die Installation, die Veränderungen von Version 1.2 zu 1.0, den ersten Kontakt mit Symfony, das automatische Erzeugen von CRUD-Funktionalität mit dem Kommandozeilen-Tool sowie für Ajax-Funktionen. Neulinge, aber auch Fortgeschrittene fühlen sich mehr umsorgt als bei Yii. Freilich erschließen sich Randbereiche auch bei Symfony nur über die automatisch erzeugte, knappe API-Dokumentation. Gelegentlich hilf auch noch das Symfony-Wiki mit Tipps oder Codebeispielen weiter [17].
Wer sich schon einmal im Projektverwaltungstool Trac befindet, sollte auch gleich die Gelegenheit nutzen und einen Blick in den Bugtracker werfen [18]. Für die aktuelle Version 1.2 findet sich dort eine Menge Einträge – die meisten davon im Zustand »closed«.
Effekte leicht gemacht
Wenn es um Ajax-Funktionalität geht, nimmt Symfony dem Entwickler mehr Arbeit ab als Yii: Es kapselt die grafischen Effekte der Scriptaculous-Bibliothek, dem Effekt-Aufsatz zur Prototype-Library, die Symfony einsetzt. Das in Yii eingebundene Jquery ist dafür aber so benutzerfreundlich, dass es eine zusätzliche Kapselung im Grunde überflüssig macht. Außerdem unterstützt Yii den Umgang mit JSON-Daten besser.
Symfony gehört wie Yii zur Klasse der Struktur-Frameworks, ist also nicht nur ein Bündel von Bibliotheksfunktionen, sondern lockt den Entwickler mit Entwurfsmustern, zum Beispiel dem MVC-Design. Neben der selbstverständlichen Ausgliederung der Layouts in View-Dateien bettet Symfony auf Wunsch auch Views in Widgets ein.
Jenseits von Objekten
Wie ihre Kollegen bei Yii sehen auch die Symfony-Entwickler die Notwendigkeit, das starre Vererbungsmodell von PHP zu sprengen: Symfony bietet ebenfalls ein Event-Modell mit zur Laufzeit registrierbaren Handlern. Mixins existierten in Symfony 1.0 in vergleichbarer Form wie in Yii, aus der Dokumentation von Version 1.2 sind sie jedoch verschwunden. Die zuständige Klasse »sfMixer« funktioniert aber wie beim Vorgänger.
Fehlen Mixins, lässt sich externer Code über die Eventhandler nur an vorher definierten Stellen einfügen. Das ist zumindest aus Sicherheitssicht günstiger: Denn wenn sich neuer Code injizieren lässt, hebelt dies den Schreibschutz des Anwendungscode für den Benutzer des Webservers faktisch aus: In den Cache-Verzeichnis- sen liegen schreibbare Dateien für den Apache-User, auf die der Server während des Auslieferns zurückgreift.
Auch Symfony erzeugt wie Yii auf Wunsch zufällige Tokens, die Cross-Site Request Forgery erschweren. HTML-Code filtert mittels HTML-Purifier jedoch erst ein Plugin der SVN-Version. Es lässt sich auch in stabilen Symfony-Versionen installieren [19].
Symfonys Testframework Lime beherrscht sowohl Unit-Tests (Abbildung 3) als auch funktionale Tests. Viele Checks führt ebenso gut ein externes Tool wie PHPunit durch [20], aber eben nicht alle. So testet Lime gezielt den Cache:

Abbildung 3: Anders als Yii enthält Symfony ein speziell auf das Framework zugeschnittenes Testpaket, das sowohl Unit- als auch funktionale Tests kennt.
include(dirname(__FILE__) .
'/../../bootstrap/functional.php');
$b = new sfTestBrowser();
//Seitenaufruf
$b->get('zu testende Seite');
// Liest Antwort aus dem Cache
$b->isCached(true);
// Weist gecachter Antwort ein Layout zu
$b->isCached(true, true);
Ein weiteres Tool hilft bei der Fehlersuche: Der Debug-Modus blendet auf jeder Seite einen Button ein, der Methodenaufrufe, SQL-Queries und verbrauchte Zeit anzeigt (Abbildung 5). Die Symfony-Klasse »sfTestBrowser« simuliert Webbrowser. Sie enthält Methoden wie »back()«, »forward()«, »reload()« und unterstützt Cookies. »click(‘Name’)« simuliert einen Klick auf einen Button oder Link. Zu prüfender Seitentext lässt sich nicht nur über reguläre Ausdrücke, sondern auch über DOM oder CSS-3-Selektoren auswählen:

Abbildung 5: Im Debug-Modus blenden alle mit Symfony gerenderten Seiten auf Knopfdruck einen Stack Trace und grundlegende Profiling-Informationen ein.
$b->checkResponseElement('p:last ul:nth-child(2) li:contains("SelektText")');
Last but not least hat Lime direkten Zugriff auf die vom Framework ausgeworfenen Exceptions.
Bremsklotz
Symfony leistet sich den Luxus zweier unabhängiger Object-Relational-Manager, Doctrine [21] und Propel [22], beides externe Projekte. Dass Symfony-Anwendern die Entscheidung zwischen ihnen nicht leicht fällt, lässt sich daran ablesen, dass Google für die Anfrage »propel versus doctrine« etwa 250000 Treffer listet. Propel gilt als intuitiver bedienbar, Doctrine hat einen etwas größeren Leistungsumfang, bei der Geschwindigkeit unterscheiden sie sich kaum.
Was die Performance des Framework insgesamt angeht, steht Symfony bei Benchmarks oft an letzter Stelle und liefert nur halb so viele Seiten wie die schnellen Yii oder Codeigniter [23]. Wer eine durchschnittlich besuchte Seite auf aktueller Hardware hostet, den braucht dies nicht zu kümmern. Relevant ist der Overhead aber bei viel Traffic oder im Shared Webhosting. Außerdem verspricht Fabien Potencier für die Version 2 eine deutliche Steigerung der Leistung [24].
Zend
Das Zend Framework unterscheidet sich konzeptionell von den anderen vorgestellten Frameworks: Es stellt wie diese das Fundament für ein Model-View-Controller-Design bereit – allerdings fakultativ. Es lässt sich auch zusammen mit anderen Frameworks als Bibliothek für Helferfunktionen ohne Abhängigkeit zum restlichen Framework einsetzen. Yii- oder Symfony-Entwickler binden das ganze Framework über einen Include-Befehl in die Datei »index.php« ein. Bei Zend lassen sich die Basisklassen der 65 Komponenten auch einzeln integrieren.
Ist unter den gewählten Komponenten der Zend-Controller, verhält sich das Zend-Frame wie Yii oder Symfony als MVC-Framework. Das Gerüst einer solchen Zend-Anwendung erzeugt wie unter Yii und Symfony ein Kommandozeilen-Aufruf. Zend enthält zahlreiche Funktionen, die auf das Unternehmensumfeld zugeschnitten sind, etwa eine LDAP-Anbindung, ein ACL-basiertes Rechtemanagement oder eine XML-RPC- und Soap-Schnittstelle.
Viele Komponenten wie der PDF-Generator, der auch zeichnet, oder der vollständig in PHP geschriebene Lucene-Port, der Word- und Powerpoint-2007-Dateien liest und Fuzzy Search unterstützt, sind für viele Zielgruppen interessant. Besonders erwähnenswert sind die Rechner für Maßeinheiten, Uhrzeiten und Kalenderdaten. Das Zend Framework kapselt auch die Javascript-Bibliotheken Dojo [25] und Jquery [8]. Einen Überblick der Komponenten gibt [26].
Lernintensiv
Da sich längere Texte schlecht am Bildschirm lesen lassen, schätzen es Seitenbesucher, wenn sie auch als PDF-Download zur Verfügung stehen. Das Zend Framework enthält einen PDF-Generator, der mit PHP-Bordmitteln sowohl Text als auch grafische Elemente einbettet. Listing 1 zeichnet ein Diagramm, das Abbildung 4 zeigt.
|
Listing 1: PDFs erzeugen mit |
|---|
01 <?php
02 set_include_path('/var/www/Zend/library');
03 require_once 'Zend/Pdf.php';
04
05 $pdf = new Zend_Pdf();
06 $pdf->pages[] = ($page = new Zend_Pdf_Page(
07 Zend_Pdf_Page::SIZE_LETTER_LANDSCAPE));
08 $page->setFont(Zend_Pdf_Font::fontWithName(
09 Zend_Pdf_Font::FONT_HELVETICA_BOLD), 32);
10 // Kreis
11 $page->setLineDashingPattern(
12 Zend_Pdf_Page::LINE_DASHING_SOLID)
13 ->setFillColor(new Zend_Pdf_Color_Rgb(1,0,0))
14 ->drawCircle(85, 375, 25);
15 // Sektoren
16 $page
17 ->drawCircle(200, 375, 25, 2*M_PI/3, -M_PI/6)
18 ->setFillColor(new Zend_Pdf_Color_Cmyk(1,0,0,0))
19 ->drawCircle(200, 375, 25, M_PI/6, 2*M_PI/3)
20 ->setFillColor(new Zend_Pdf_Color_Rgb(1,1,0))
21 ->drawCircle(200, 375, 25, -M_PI/6, M_PI/6);
22 //Text
23 $page
24 ->setFillColor(new Zend_Pdf_Color_Rgb(0,0,0,0))
25 ->drawText('Dies ist ein Text', 50, 280);
26 $pdf->save($argv[2]);
|

Abbildung 4: Das Zend-Framework enthält viele einzeln nutzbare Komponenten, zum Beispiel einen PDF-Generator (siehe Listing 1). Der Code erzeugt eine neue Seite, setzt Farben und zeichnet anschließend die Kreissegmente und den Text.
Dem Zend Framework haftet der Ruf an, den Einstieg mit einer steilen Lernkurve zu erschweren. Ohne Zweifel ist die MVC-Komponente komplizierter als bei der Konkurrenz, das zugehörige Handbuch [27] stellenweise akademisch. Andererseits gibt es auch für Zend ein verständliches Einsteiger-Tutorial. Die Dokumentation ist sehr ausführlich und enthält Quellcode-Beispiele.
Wer das ganze Leistungsspektrum des Framework kennenlernen möchte, muss allerdings viel Zeit investieren. Wie das Beispiel aus Listing 1 zeigt, bleibt der Aufwand beim Einarbeiten in einzelne Komponenten im Rahmen. Das Handbuch erläutert sie, ohne Wissen zum restlichen Framework vorauszusetzen.
Umfangreiches Baumaterial
Die drei PHP-Frameworks Yii, Symfony und Zend Framework decken ein breites Spektrum ab: Yii ist schnell und enthält neue interessante Konzepte. Die Community ist klein, aber aktiv und hilfsbereit. Symfony glänzt mit großem Leistungsumfang, der auch auf das Framework abgestimmte Testkomponenten enthält. Community und Entwicklerteam sind viel größer als bei Yii.
Hinter dem Zend Framework steckt die Firma der PHP-3-Initiatoren Zeev Suraski und Andi Gutmans, die PHP-Produkte für Unternehmen anbietet, außerdem tragen Google, Microsoft und Strikeiron bei. So entstand ein Rahmenwerk, das den Bedarf von Enterprise-Projekten abdeckt. Wer jedoch nur einzelne Komponenten herauspicken möchte, findet im Zend Framework dank modularem Design und gut gegliedertem Handbuch effiziente Lösungen für Einzelprobleme. (mg)
|
Der Autor |
|---|
|
Peter Kreußel hat zahlreiche Artikel für das Linux-Magazin verfasst. Er arbeitet als freier Autor und Webenwickler. Sein besonderes Interesse gilt semantischen Technologien und Cross-Media-Publishing. |






