Eigentlich hat mal wieder alles wie üblich harmlos angefangen. Eigentlich ging es mir nur darum, die Funktionen von RRDTool in meinen Scripten nutzen zu können, ohne auf Prozesssteuerbefehle wie system, exec, popen & Co. zurückgreifen zu müssen, da diese auf meinem Server aus gutem Grund deaktiviert sind. Dafür begab ich mich nun auf die Suche, ob es für PHP ggf. bereits eine entsprechende Extension gibt und wurde auch recht schnell fündig: Für PHP4 hatte bereits vor mehreren Jahren jemand sich die Mühe gemacht und eine entsprechende, kleine Erweiterung geschrieben. Glücklicherweise ließ sich diese (nach Download der benötigten Header) auch problemlos für PHP5 compilieren. Da die Dokumentation wie üblich aus dem bestand, was der C-Compiler zu gesicht bekommt, hab ich natürlich einen Blick dorthinein geworfen und musste feststellen, dass eine Reihe von Funktionen, insbesondere das Dumpen von RRD-Files, das Lesen von Infos und ein paar der neueren Funktionen von RRDtool bisher nicht über die Extension ansprechbar waren.
Und so begab es sich, dass ich zuerst die bestehenden Funktionen auf einen aktuellen Stand bringen wollte, wobei mir eine bisher leider erst 3-Teilige Serie Extension Writing for PHP (Part I, IIa, IIb, III) eine ganze Reihe nützlicher Informationen über die Zend-API gegeben hat, deren beste Informationsquelle ansonsten in /usr/include/php5 verborgen ist 😉 Denn nicht mal die mehr oder weniger offizielle Doku hält es für nötig, so schon vorhanden, dann auch noch vollständig zu sein – wär ja auch noch …
Und so entstand, nach und nach – u.a. unter Mithilfe der Leute von der rrd-developers Mailingliste eine überarbeitete Version der PHP-Extension, die eine ganze Reihe neuer Funktionen beinhaltet und nebenbei sogar ein paar Speicherlöcher behebt – wenngleich manche Löcher mehrfach zu beheben waren.
Zudem bot diese Extension aber auch Anlass für eine neue Funktion, die die bisher bereits vorhandene Funktion rrd_dump zum Extrahieren einer RRD-File in einen XML-Dump nun auch in-memory nutzbar macht, was insbesondere für die PHP-Bibliothek von nutzen war, erspart es einem in PHP unnötig aus Dateien lesen zu müssen.
Aber gut: Manche Fehler programmiert man immer noch selbst: Nachdem heute nochmals eine Reihe weiterer Änderungen aus einem überarbeiteten Stand von der Mailingliste einfließen sollten, stellte ich beim Testen fest, dass sich PHP (insbesondere der Suhosin-Patch) an einem defekten Canary störte. Eine Untersuchung des Fehlers führte zu folgender, fehlerhaften Zeile:
rrd_arg_array *result = (rrd_arg_array *)emalloc(sizeof(rrd_arg_array *));
Das Finden der Ursache benötigte hier 10 Minuten und eine ganze Reihe von Compile-Gängen, um die Ursache lokalisieren zu können. Pointer sind halt wie Hotels: Je mehr Sterne, desto besser.
Nachdem nun die Arbeit soweit getan ist, bleibt eigentlich nur noch abzuwarten, ob sich noch irgendwelche Bugs im Source verstecken. Ich hoff’s aber mal nicht. Das werd ich aber sicherlich demnächst noch erfahren …
Wie sieht es mit einem Windows Port für 32 und 64 Bit aus?
Kommentar by neo — 27.08.2009 @ 11:00:56
Sollte theoretisch unter Windows compilieren; hab aber leider keine Build-Umgebung für Windows da … Einfach probieren und berichten …
Kommentar by BenBE — 31.08.2009 @ 01:40:13