PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Extending and Embedding PHP

with 4 comments

Im Februar habe ich von Andre das Buch Extending and Embedding PHP von Sara Golemon angeboten bekommen, und da ich noch keinen tieferen Blick in die Erstellung von PHP Extensions geworfen habe, habe ich zugeschlagen. Wie man bei Amazon lesen kann ist es DAS Standard-Buch wenn es um PHP Erweiterungen geht. Allgemein gibt es über die Innereien von PHP nur wenig Literatur, umso interessantere Einblicke gibt das Buch.

Die 410 Seiten beginnen mit einem Überblick über den PHP Lebenszyklus. Wie verhält sich PHP im CLI Modus, in einer Multi-Prozess-Umgebung, in einer threaded-Umgebung oder wenn PHP in eine andere Applikation eingebettet wird? Es gibt definierte Initialisierungspunkte, in die sich eine Extension einhängen kann (bzw. muss), und eine threaded Umgebung ist nicht ganz problemfrei wenn es um Datenzugriff etc. geht. Auf jeden Fall interessante Einblicke, was PHP so beim „Start“ tut.

PHP Extensions sind in C geschrieben, und so macht man sich mit den grundlegenden Datentypen und dem Speichermanagement bekannt. Um eine erste Hello-World-Extension zu schreiben und zu kompilieren werden diverse Compiler-Tools und eine Umgebung benötigt, die Installation eben dieser wird ausführlich für Linux und Windows beschrieben, sodass um fünften Kapitel die erste Hello World Extension erstellt wird.

Danach geht es weiter mit den verschiedenen Möglichkeiten, einen Wert zurückzugeben, die Kunst der Parameter-Definition, Arrays und HashTables mit Hilfe von Vektoren bzw Linked Lists und der Zend Hash API. Ressourcen sind in PHP besondere Datentypen, sodass auch hier ein Kapitel Licht ins Dunkel bringt, wie man diese erstellt, registriert, zerstört und persistiert.

Wenn die eigene Extension einen objektorientieren Zugriff bieten soll, müssen die Grundlagen zu PHP4 und PHP5 Objekten gelegt sein, was in den Kapiteln 10 und 11 geschieht. Nach diesen jeweils knapp 10 Seiten ist man in der Lage, Methoden zu deklarieren und Attribute sowie Konstanten anzulegen.

Da jede Extension auch seine eigenen php.ini Einstellungen haben kann, wird natürlich auch dies erklärt, inklusive der Möglichkeit, die Extension im phpinfo() Aufruf unterzubringen. Danach geht es etwas ausführlicher in die Materie der Streams, was jedoch teilweise harter Tobak ist.

Die letzten Kapitel behandeln nochmals die Kompilierung, die Nutzung von Libraries sowie Abhängigkeiten zwischen eben diesen, und die Möglichkeiten von Extension Generatoren (ext_skel und PECL_Gen). 20 weitere Seiten behandeln dann das Einbetten von PHP, wobei ich diese Seiten nur überflogen habe, da ich garantiert nichts habe, wo ich PHP einbetten könnte.

Auf der Suche nach dem nächsten Kapitel stiess ich bereits auf die Anhänge, wie die Zend API Referenz und PHP API. 130 Seiten Anhänge (von 410) finde ich etwas viel, aber für jemanden der sich tief einarbeiten möchte sind diese APIs sehr wichtig, und da es sie sonst nirgends so aufgelistet gibt sind sie im Buch enthalten.

Insgesamt ein interessanter Einblick in den PHP Interpreter und den Kern von PHP selbst, den man als normaler Entwickler eigentlich nie zu Gesicht bekommt. Wenn man es gelesen hat versteht man PHP ein wenig mehr, allerdings ist es kein Must-Have meiner Meinung nach. Es nimmt einem aber die Angst, selbst PHP Erweiterungen zu schreiben, wer bereits C Kenntnisse hat kann relativ schnell erste Erfolge verbuchen. Wenn eine performance-kritische Stelle in PHP entdeckt wird, und auch nach allen algorithmischen Verbesserungen die Geschwindigkeit nicht ausreicht, sollte man versuchen den Code in C zu übersetzen und als Extension einzubinden, so schwer ists nicht. Wenn aber die Festplatte oder das Netzwerk oder die Datenbank der Flaschenhals sind (wie es häufig der Fall ist), dann kann da auch eine Extension in C nicht viel helfen.

Einen guten Einblick und Einstieg bieten die Artikel von Sara in der Zend Developer Zone über das Schreiben und Erstellen von PHP Extensions Part 1, Part 2A, Part 2B und Part 3. Sara hat auch auf der ZendCon 2008 über „PHP Extension Writing“ gesprochen, der Audio-Mitschnitt ist durchaus hörenswert.

Mal sehen ob ich in den nächsten Tagen dazu komme, mir meine kleine eigene Extension zu bauen, mir fehlt noch eine kleine Idee, was man umsetzen könnte mit wenigen dutzend Zeilen Code.

Written by Michael Kliewe

April 28th, 2011 at 10:16 am

4 Responses to 'Extending and Embedding PHP'

Subscribe to comments with RSS or TrackBack to 'Extending and Embedding PHP'.

  1. Das Buch steht bei mir auch im Schrank. Und wenn ich mal viel Zeit habe, setze ich mich mit den Extensions auseinander.

    C ist momentan so eine kleine Hürde, aber die bekommt man sicher auch gemeistert 😀

    Falls du eine Erweiterung bastelst, schreibst du deine Erfahrungen hier sicher auch nieder. Ich würde das gerne lesen 🙂

    Norbert

    28 Apr 11 at 11:26

  2. Danke für den Tipp! Gleich mal bestellt. 🙂

    Phil

    28 Apr 11 at 12:56

  3. Das Thema des Buches ist auf jeden Fall interessant. Viele Autoren hören ja leider schon nach den Basics wieder auf. 🙁

    Daniel

    28 Apr 11 at 15:35

  4. Ich wäre unbedingt für eine verbesserte Variante von array_merge_recursive() 😉
    Vermutlich erinnsert Du dich an unsere Diskussion. Die hat ja leider die Problematik das sie ab der zweiten Ebene assoziative Keys nicht mehr überschreibt (wie auf der ersten Ebene und bei array_merge(), ausführlich dazu in den Kommentaren bei http://de.php.net/manual/en/function.array-merge-recursive.php).
    Dabei bräuchte man das so oft (z.B. verschachtelte Parameter). Dann vielleicht als array_merge_deep() oder so?

    Oder eine array_overwrite() und array_overwrite_recursive() und die überschreiben dann immer alles, auch numerische keys?

    Sowas könnte ich mir wirklich nützlich vorstellen und hoffentlich nicht so aufwändig. Interessant wäre auch was das an Performance bringt.

    Noch interessante wäre dann vielleicht in nem richtigen Projekt auszuprobieren ob man was an der Performance merkt wenn man die Zend/Symfony-Eigenen PHP-Implementierungen mit der eigenen C-Variante ersetzt.

    Florian Heinze

    7 Mai 11 at 10:17

Leave a Reply

You can add images to your comment by clicking here.