PHP Modul in C – Wie geht das?

20. Juni 2014 von Markus Mächler Veröffentlicht unter Know-how/Tipps&Tricks, Web Applications Verschlagwortet mit ,

Im Rahmen des diesjährigen Free Your Mind Day haben wir uns mit dem Schreiben einer PHP Erweiterung auseinandergesetzt. Nicht das Schreiben einer Erweiterung mit PHP, sondern eine Erweiterung der Sprache PHP geschrieben in C.

Der Core von PHP besteht im Wesentlichen aus der Zend Engine und dem eigentlichen PHP Core. Die Zend Engine übersetzt das, für Menschen lesbare, PHP Skript in Maschinencode und führt diesen aus. Der eigentliche PHP Core übernimmt die Kommunikation mit dem Server. Der ganze Rest der PHP Funktionalität ist in Erweiterungen (z.B. Curl, MySQL oder Sockets) programmiert. Diese Erweiterungen können nach Belieben installiert oder deinstalliert werden und enthalten etwa 2’500 Funktionen.

Das Schreiben einer solchen Erweiterung ist einfacher, als man meinen könnte. Wer programmieren kann und ein gewisses Verständnis von PHP und C hat, kann schnell loslegen. Von Vorteil ist das Arbeiten auf einem Unix System. Im Folgenden wird das Erstellen eines kurzen „HELLO SNOWFLAKE“ gezeigt.

How to

Es werden folgende Installationen benötigt:

  • PHP Source
  • Einen C Compiler (z.B. gcc)
  • PHP Entwickler Tools (phpize und php-config)

Danach müssen 3 Dateien erstellt werden:

  • config.m4: Konfiguration um die Erweiterung aktivieren zu können
  • php_snowflake.h: Das Header File
  • snowflake.c: Der eigentliche Code der Erweiterung

config.m4

php_snowflake.h

snowflake.c

Der grösste Teil dieser Dateien ist nur Konfiguration und Bekanntmachung unserer Extension. Der ganze Code der ausgeführt werden soll, wird in der Funktion PHP_FUNCTION(snowflake) { … } untergebracht. In unserem Beispiel ist das eine einfache Ausgabe eines HTML Kommentars.

Danach müssen im Ordner der Erweiterung die folgenden Befehle ausgeführt werden um die Extension zu erstellen:

Diese Befehle generieren eine ganze Reihe von Dateien. Darunter befindet sich die Datei /modules/snowflake.so. Darin ist die ganze Erweiterung enthalten. Es reicht diese Datei in den PHP Extension Ordner (/usr/local/lib/php/extensions/) zu verschieben und die Erweiterung in der php.ini zu integrieren (extension=snowflake.so).

Danach kann ein kurzes PHP Skript geschrieben und die Funktion getestet werden:

index.php 

Man kann natürlich viel Sinnvolleres damit anstellen, als ein einfaches „HELLO SNOWFLAKE“. Deshalb haben wir uns noch eine Funktion der hauseigenen Open Source Software todoyu geschnappt und diese in C nachprogrammiert. Die Funktion hat zwei Parameter: Ein zweidimensionales Array (sozusagen eine Tabelle) und einen String, der einen Spaltennamen repräsentiert. Daraus berechnet die Funktion den Durchschnitt aller Werte der entsprechenden Spalte. Ein kleines Benchmark mit einem Array mit 1.3 Millionen Einträgen hat folgendes Resultat hervorgebracht:

PHP Code: 1.61s
C Funktion: 0.1s

Bereits bei einer relativ simplen Funktion zeigt sich, was wir bereits vermutet hatten, nämlich dass der C Code um einiges schneller ist. Es lohnt sich allerdings trotzdem nur in den seltensten Fällen selbst eine PHP Erweiterung zu schreiben. Oft muss nicht über 1.3 Millionen Einträge iteriert werden, PHP liefert bereits eine Funktion, die genau das abdeckt oder die Aufgabe kann gecached werden.

Dieser Blog Beitrag soll nur eine kleine Übersicht über den Prozess liefern. Eine detaillierte Anleitung zu dem Thema gibt es von Zend oder webtutor.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.