Kristof Dreier — where tech meets text
Willkommen im privaten Blog von Kristof Dreier, Webentwickler und Mac-Enthusiast aus Münster. Thematisch dreht es sich hier um Webdevelopment mit dem Zend Framework, kleinere Einschübe über Cocoa und vielleicht auch mal ein Blick in die Weiten von Ruby on Rails.
Hallo PHP. Hallo Erlang. Darf ich euch Thrift vorstellen?
Zum ersten Mal von Thrift gehört habe ich auf dem railscamp in Münster. Dort hatte @railsbros_dirk die Thematik vorgestellt. Natürlich mit Rails. Seitdem hat mich das Thema nicht mehr losgelassen, aber mich wirklich auseinandergesetzt habe ich mich damit natürlich auch nicht. Jetzt bin ich vor ein paar Tage auf Erlang) gestoßen und da kam mir dann wieder Thrift in den Sinn. Wäre es nicht toll, wenn alle rechenintensiven Operationen von Erlang übernommen werden könnten — Parallelität für den Gewinn — und ich das Frontend wie gewohnt mit PHP entwickeln kann?
Leider mangelt es an leicht verständlichen Anleitungen, wie dies am einfachsten zu Bewerkstelligen ist, weswegen ich meine Erfahrung von gestern gerne mit euch teilen möchte.
Aller Anfang ist schwer
Ganz ohne Vorkenntnisse geht es leider nicht, aber man muss auch nicht ein Supernerd sein, um es zum Laufen zu bekommen. Folgendes setze ich für die Installation aber voraus:
- Fink oder MacPorts ist installiert
- Developer-Tools sind installiert (sind auf der Install-DVD des Betriebssystems)
- Keine Angst vor dem Umgang mit dem Terminal
- Erlang und PHP sind auf dem System vorhanden
- SVN ist bei bei installiert
- git ist auch installiert
Auch wenn die Anleitung explizit für OS X 10.5 sind, sollte es eigentlich keine Probleme geben, diese unter Linux auszuführen.
Thrift-Vorbereitung
Fangen wir einfach direkt an. Wer möchte kann alle Dateien in sein Home-Verzeichnis runterladen und entpacken. Da ich ein kleiner Ordnungsmensch bin, habe ich mir einen neuen Ordner thrift_compiling angelegt und hinein gewechselt.
mkdir thrift_compiling
cd thrift_compiling
Um Thrift selbst zu kompilieren brauchen wir boost, welches wir uns mit folgendem Befehl runterladen können.
curl -LO http://downloads.sourceforge.net/project/boost/boost/1.39.0/boost_1_39_0.tar.gz?use_mirror=ovh
Entpackt wird das ganze wie folgt:
tar xzf boost_1_39_0.tar.gz?use_mirror=ovh
Und nun wechseln wir in das so eben erstelle Verzeichnis mit
cd boost_1_39_0
Kommen wir nun zum Kompilieren, welches aus drei Schritten besteht: konfigurieren, kompilieren und installieren. Das Schöne an der Sache ist, dass sich das Ganze auf drei einfache Befehle reduzieren lässt. Führ die Befehle jeweils einzeln aus, sobald der vorherige durchgelaufen ist. Das Kompilieren kann einige Zeit in Anspruch nehmen und du kannst währenddessen einen Kaffee trinken gehen, oder einen kleinen Spaziergang machen.
Das wäre boost gewesen. Wir verlassen nun das Verzeichnis und machen mit Thrift weiter.
cd ..
Thrift-Installation
Jetzt kommt die eigentliche Thrift-Installation. Diese holen wir uns direkt aus dem Thrift-Repository via svn, das wir mit folgendem Befehl erledigen können:
svn co http://svn.apache.org/repos/asf/incubator/thrift/trunk thrift
In das gerade erstellte Verzeichnis wechseln:
cd thrift
Bevor wir nun zum Kompilieren kommen, müssen wir noch eine Datei aus dem Paket pkgconfig kopieren. Falls du das Paket noch nicht installiert haben solltest, kannst du das mit folgendem Befehl nachholen:
Fink
Installiert wird das Paket mit:
sudo fink install pkgconfig
Danach kopierst du die pkg.m4 in das Thrift-aclocal-Verzeichnis mit folgendem Befehl:
cp /sw/share/aclocal/pkg.m4 aclocal/
MacPorts
Installiert wird das Paket mit:
sudo port install pkgconfig
Danach kopierst du die pkg.m4 in das Thrift-aclocal-Verzeichnis mit folgendem Befehl:
cp /opt/local/share/aclocal/pkg.m4 aclocal/
Nun bereiten wir alles wieder zum Kompilieren vor:
Starten des Kompiliervorgangs (auch hier gilt wieder, dass es ein bisschen dauern kann und man die Zeit sinnvoller nutzen kann, als auf die Terminal-Ausgabe zu starren):
make
sudo make install
cd ..
thrift_erl_skel oder “Schön, dass sich wer die ganze Arbeit schon gemacht hat”
Zum Glück gibt es die Leute von Amie Street, die übrigens auch die neuen Erlang-Bindings geschrieben haben. Todd Lipcon hat nämlich ein Grundgerüst für eine Thrift-Erlang-Anwendung mit allem Pipapo erstellt, sodass man sich voll auf die Entwicklung in Erlang konzentrieren kann. Ein bisschen muss man natürlich trotzdem selber machen, also holen wir uns am besten einfach einmal das Grundgerüst.
git clone git://github.com/toddlipcon/thrift_erl_skel.git
Wir wechseln in das Verzeichnis:
cd thrift_erl_skel
Am einfachsten ist es, den Pfad zu diesem Ordner in die PATH-Variable mit aufzunehmen. So lässt sich dann von überall einfach make_new_thrift.pl aufrufen um eine neue Anwendung zu erstellen.
Eine simple Anwendung
Wir haben nun alle Vorbereitungen abgeschlossen und können an die eigentliche Anwendung gehen. Um diese zu erstellen rufen wir das Perl-Script mit folgendem Befehl auf
./make_new_thrift.pl calculator Calculator 9090
Der erste Paramater ist der Name unserer Thrift-Datei, die wir gleich noch erstellen, ohne Endung. Das zweite Argument ist der Name unseres Services und danach folgt der Port der Anwendung.
Nun kopieren wir aus dem Thrift-lib-Verzeichnis das erl-Verzeichnis.
cp -R ../thrift/lib/erl/ ./thrift
Danach wechseln wir in das soeben erstellte Verzeichnis und führen make aus und erlassen das Verzeichnis wieder:
Als nächstes erstellen wir ein neues Verzeichnis mit dem Namen if und wechseln darein:
Nun erstellen wir unsere Thrift-Datei. Ich werde in die Thematik nicht genauer einsteigen, unter ThriftTypes und in der tutorial.thrift im Tutorial-Verzeichnis von Thrift findest du dazu weitere Informationen.
Da ich mit Textmate arbeite, startet der folgende Befehlt mit mate, falls du lieber mit vim, nano oder anderen Editoren arbeitest, ersetze mate einfach damit.
mate calculator.thrift
Im Texteditor eure Wahl fügst du dann folgendne Code-Schnippsel ein:
Speichern und den Editor beenden. Nun verlassen wir das Verzeichnis und wechseln wieder in unsere Erlangen-Anwendung. Dort bearbeiten wir nun im src-Verzeichnis die Datei calculator_service.erl.
cd ..
cd calculator
mate src/calculator_service.erl
Und ergänzen wir die Datei um unsere beiden Methoden add und sub, welche danach wie folgt aussehen sollte:
Wir speichern die Datei und kompilieren diese. Danach ist unsere Anwendung fertig und wir können den Service starten.
make
./start_calculator.sh
Der PHP-Client
Erstellen wir uns jetzt doch einfach noch schnell einen PHP-Client, der mit dem Erlang-Service kommunizieren kann. Da wir ja bereits eine Thrift-Datei haben, können wir den großen Teil der Arbeit vom Thrift-Generator erledigen lassen. Dazu öffnen wir ein neues Shell-Fenster und wechseln in das thrift_erl_skel-Verzeichnis und erstellen dort ein neues Verzeichnis client, danach starten wir den Generator.
Nun holen wir uns noch die benötigten PHP-lib-Dateien:
cp -R ../../thrift/lib/php/src/ ./thrift
Nun erstellen wir uns eine neue PHP-Datei — ich hab die einfach Calculator.php genannt — und füllen diese mit folgendem Inhalt:
mate Calculator.php
Speichern und die Datei schließen. Eine kleine Änderung müssen wir noch in der Calculator.php im gen-php-Verzeichnis vornehmen, also flux geöffnet
mate gen-php/Calculator.php
Dort müssen wir in Zeile 9 folgende Zeile:
include_once $GLOBALS['THRIFT_ROOT'].'/packages/calculator/calculator_types.php';
mit dieser ersetzen
include_once $GLOBALS['CLIENT_ROOT'].'/gen-php/calculator_types.php';
auch hier wieder speichern und den Texteditor schließen. Auf der Konsole geben wir nun folgendes ein
php Calculator.php
und wir sollten eine wunderschöne Ausgabe erhalten
Addition: 7
Subtraktion: 1
Herzlichen Glückwunsch, dein PHP-Client hat so eben eine Anfrage via Thrift an den Erlang-Service gemacht, der dort die Rechenopperation ausgeführt hat und das Ergebnis via Thrift wieder an deinen PHP-Client geschickt hat, der sich dann um die Ausgabe kümmerte. Ab jetzt bist du auf dich alleine gestellt!
Get that party started
Das war es, meine Anleitung um mit Thrift die Kommunikation zwischen PHP und Erlang zu ermöglichen. Das mag an der ein oder anderen Stelle noch ein bisschen rau und ungeschliffen daher kommen, was aber daran liegt, dass ich mir Thrift gestern zum ersten Mal angeschaut habe und teilweise wirklich verzweifelt bin. Es gibt garantiert noch einige Prozesse die man irgendwie optimieren kann, damit es nicht ganz so aufwendig ist und ich wäre überaus glücklich, wenn ein Thrift-Guru sein Wissen hier teilen würde. Selbst wenn es nicht dazu kommen sollte, werde ich mich definitiv weiter mit der Thematik auseinandersetzen, da es einfach unglaublich spannend ist, rechenintensive Operationen auszulagern und trotzdem noch mit einer anderen Sprache sich um die Ausgabe kümmern. Gerade im Team in einem Unternehmen kann das doch ganz nützlich sein, wo Erlang wohl noch nicht jeden Programmierer erreicht hat.
Wie immer freue ich mich über Kommentare, Verbesserungsvorschläge und sachdienstlichen Hinweisen zu Fehlern im Text.
seitsu
Okt 30, 22:24
Danke für die ausführliche Einleitung. Die offizielle Doku ist ja eher spärlich. ;-) So ganz bin ich noch nicht hinter die Geschichte gestiegen, aber jetzt ist habe ich zumindest einen groben Überblick gewinnen können.
Die PHP Klassen sehen aufgrund der ganze $GLOBALS etwas suboptimal aus, aber mal sehen was man damit alles so anfangen kann.