Von einem, der auszog, MySQLi in die HHVM zu bringen

MySQLi in der HHVM
Kommentare

Emil Hesslow ist kurz vor Weihnachten für einen Hackmonth (der in seinem Fall mittlerweile schon etwas länger andauert) zu Facebooks HHVM-Team gestoßen. Dort kümmert er sich um eines der am meisten nachgefragten Features für die HipHop Virtual Machine: Die Implementierung von MySQLi. Und da das nicht unbedingt die trivialste Aufgabe ist die man sich wünschen kann, teilt er seine Erfahrungen in einem aktuellen Blogpost mit der Community.

MySQLi in der HHVM ist eines der am sehnlichsten erwarteten Features überhaupt für Facebooks PHP-Runtime – und eines der wichtigsten, um das selbst gesteckte Kompatibilitätsziel zu erreichen zu können. Zum Glück stehen die Zeichen nicht schlecht dafür, dass der Wunsch bald erfüllt werden könnte.

Aller Anfang ist schwer

Als Emil Hesslow seine Arbeit aufgenommen hat, musste er sich vorbereitend zunächst um einige andere Dinge kümmern. Um den ini-Parser, um genau zu sein. Das sollte sich jedoch recht bald als nicht zu unterschätzende Herausforderung entpuppen:

This was released in HHVM 2.4.0. Interestingly, the parser was going to be shipped with HHVM 2.3.0; but when we tested the RC (release candidate), we noticed that we had a bunch of ini files at Facebook that the parser failed upon. So, I had to fix those files before we could release the new one.

Der Grund für die Arbeiten am Parser findet sich in den Tests – denn dafür wird die Zend Test Suite verwendet. Und genau diese Test Suite ist es, die das Vorankommen der Implementierung etwas ins Stocken geraten lässt.

Test ALL The Things!

Mit zwei schwerwiegenden Problemen hatte Hesslow zu kämpfen. Zum einen war da die Tatsache, dass die rund 300 Tests der Suite nicht dazu gedacht waren, parallel zu laufen. Da viele von ihnen auf die selben Tabellen zugreifen, kann es passieren, dass sie gleichzeitig auf die Tabelle zugreifen – und somit unter Umständen dazu führen, dass der Test fehlschlägt. Das Problem konnte Hesslow jedoch durch eine Umstellung den Import-Skripts relativ leicht lösen.

Das zweite Problem wird von Facebook ZendParamMode genannt. Einfach ausgedrückt bedeutet das folgendes:

In short, when using ZendParamMode, if a function is called with a parameter of the wrong type, a warning is logged and the function returns null.

Die Sache ist nun, dass im HHVM Native Interface (HNI) – diese geniale Erfindung, die es Entwicklern erlaubt, PHP-Extensions in PHP statt in C++ zu schreiben – den ZendParamMode nicht in der vorgesehenen Art unterstützen. So kommt es, dass die Tests Fehler werfen, obwohl eigentlich alles anstandslos funktioniert hat; mit Ausnahme des Handlings eben jenes ZendParamModes.

Hesslows Lösung für dieses Problem war einfach: Erneut das Import-Skript anpassen und – zack – alle Tests rauswerfen, in denen dieser Mode getestet wird. Im Prinzip stellt das zwar kein all zu großes Hindernis dar, immerhin geht es darum, dass die Implementierung am Ende funktioniert, allerdings führt das zu einem eher unschönen Ergebnis.

182 : 114

Kommen wir zu der für die meisten wohl interessantesten Frage: Wie steht es denn nun um MySQLi in der HHVM?

Die Frage lässt sich so leicht nicht beantworten. Aktuell wurden 182 Zend-MySQLi-Tests erfolgreich absolviert, 114 Tests schlagen hingegen fehl. Eine gute Nachricht gibt es aber auch:

However, many of those 114 tests are failures are what I call “technicality” failures. For example, when we var_dump() a double, we print more digits which makes our output different from Zend.

Allerdings fehlen noch ein paar Puzzlestücke, um alle Zend-Tests zu bestehen. So fehlt beispielsweise aktuell noch die Möglichkeit, Default-Werte aus der php.ini auszulesen – ein Problem, an dem man aber gerade arbeite. Außerdem gebe die HHVM-Variante andere Fehlermeldungen aus, was den Test Runner bei einem Vergleich der zu erwartenden Werte natürlich zur Verzweiflung treibt.

Das größte Problem stellt aktuell jedoch der verwendete Treiber dar. Zend hat zwei verscheidene im Angebot: das normale MySQL C API und den hauseigenen MySQL Native Driver. Die HHVM nutzt ersteren und unterstützt daher nicht die Funktionen, für die man den nativen Treiber bräuchte. Zwar könne man wohl für einige Funktionen einen Workaround finden, aber aktuell fehle für all jene Funktionen der Support.

Ermutigend ist aber, dass 100 Prozent der doctrine/dbal Unit Tests und CodeIgniter Unit Tests ohne Fehler durchlaufen, wenn sie mit MySQL durchgeführt werden.

Release am 27. März 2014?

Der Plan sieht vor, MySQLi mit HHVM 2.5.0 zu veröffentlichen – und die soll nach offiziellem Release Schedule am 27. März 2014 erscheinen. Bis dahin steht aber natürlich noch einiges an Arbeit an.

So muss man ZendParamMode in der HNI zum Laufen bekommen. Außerdem ist es natürlich wünschenswert, die Zahl der fehlgeschlagenen Tests zu reduzieren.

Bis dahin kann natürlich jeder das aktuelle Nightly Package ziehen und mit dem bisherigen Stand der Implementierung experimentieren. Das haben schon einige getan und – bisher zumindest – noch keine Probleme feststellen können.

Wenn alles gut läuft, kann das Team Ende März also eine HHVM-Version veröffentlichen, die viele Entwickler aus der PHP-Community glücklich machen dürfte. Spätestens dann sollte man einen ersten Blick riskieren.

Aufmacherbild: Hiker with backpack standing on top of a mountain von Shutterstock / Urheberrecht: Dudarev Mikhail

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -