{"id":374,"date":"2009-08-26T20:41:02","date_gmt":"2009-08-26T18:41:02","guid":{"rendered":"http:\/\/blog.benny-baumann.de\/?p=374"},"modified":"2009-08-26T20:41:02","modified_gmt":"2009-08-26T18:41:02","slug":"php-extensions-schreiben-leichtgemacht","status":"publish","type":"post","link":"https:\/\/blog.benny-baumann.de\/?p=374","title":{"rendered":"PHP: Extensions schreiben leichtgemacht"},"content":{"rendered":"<p>Eigentlich hat mal wieder alles wie \u00fcblich harmlos angefangen. Eigentlich ging es mir nur darum, die Funktionen von <a href=\"http:\/\/oss.oetiker.ch\/rrdtool\/\">RRDTool<\/a> in meinen Scripten nutzen zu k\u00f6nnen, ohne auf Prozesssteuerbefehle wie system, exec, popen &#038; Co. zur\u00fcckgreifen zu m\u00fcssen, da diese auf meinem Server aus gutem Grund deaktiviert sind. Daf\u00fcr begab ich mich nun auf die Suche, ob es f\u00fcr PHP ggf. bereits eine entsprechende Extension gibt und wurde auch recht schnell f\u00fcndig: F\u00fcr PHP4 hatte bereits vor mehreren Jahren jemand sich die M\u00fche gemacht und eine entsprechende, kleine Erweiterung geschrieben. Gl\u00fccklicherweise lie\u00df sich diese (nach Download der ben\u00f6tigten Header) auch problemlos f\u00fcr PHP5 compilieren. Da die Dokumentation wie \u00fcblich aus dem bestand, was der C-Compiler zu gesicht bekommt, hab ich nat\u00fcrlich 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 \u00fcber die Extension ansprechbar waren.<!--more--><\/p>\n<p>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 <a href=\"http:\/\/devzone.zend.com\/node\/view\/id\/1021\">I<\/a>, <a href=\"http:\/\/devzone.zend.com\/node\/view\/id\/1022\">IIa<\/a>, <a href=\"http:\/\/devzone.zend.com\/node\/view\/id\/1023\">IIb<\/a>, <a href=\"http:\/\/devzone.zend.com\/node\/view\/id\/1024\">III<\/a>) eine ganze Reihe n\u00fctzlicher Informationen \u00fcber die Zend-API gegeben hat, deren beste Informationsquelle ansonsten in \/usr\/include\/php5 verborgen ist \ud83d\ude09 Denn nicht mal die mehr oder weniger <a href=\"http:\/\/www.php.net\/manual\/de\/internals2.php\">offizielle Doku<\/a> h\u00e4lt es f\u00fcr n\u00f6tig, so schon vorhanden, dann auch noch vollst\u00e4ndig zu sein &#8211; w\u00e4r ja auch noch &#8230;<\/p>\n<p>Und so entstand, nach und nach &#8211; u.a. unter Mithilfe der Leute von der rrd-developers Mailingliste eine \u00fcberarbeitete Version der PHP-Extension, die eine ganze Reihe neuer Funktionen beinhaltet und nebenbei sogar ein paar Speicherl\u00f6cher behebt &#8211; wenngleich manche L\u00f6cher mehrfach zu beheben waren.<\/p>\n<p>Zudem bot diese Extension aber auch Anlass f\u00fcr 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\u00fcr die PHP-Bibliothek von nutzen war, erspart es einem in PHP unn\u00f6tig aus Dateien lesen zu m\u00fcssen.<\/p>\n<p>Aber gut: Manche Fehler programmiert man immer noch selbst: Nachdem heute nochmals eine Reihe weiterer \u00c4nderungen aus einem \u00fcberarbeiteten Stand von der Mailingliste einflie\u00dfen sollten, stellte ich beim Testen fest, dass sich PHP (insbesondere der Suhosin-Patch) an einem defekten Canary st\u00f6rte. Eine Untersuchung des Fehlers f\u00fchrte zu folgender, fehlerhaften Zeile:<\/p>\n<pre lang=\"c\">\trrd_arg_array *result = (rrd_arg_array *)emalloc(sizeof(rrd_arg_array *));<\/pre>\n<p>Das Finden der Ursache ben\u00f6tigte hier 10 Minuten und eine ganze Reihe von Compile-G\u00e4ngen, um die Ursache lokalisieren zu k\u00f6nnen. Pointer sind halt wie Hotels: <a href=\"http:\/\/slexy.org\/view\/s2qBPPzw6Q\">Je mehr Sterne, desto besser<\/a>.<\/p>\n<p>Nachdem nun die Arbeit soweit getan ist, bleibt eigentlich nur noch abzuwarten, ob sich noch irgendwelche Bugs im Source verstecken. Ich hoff&#8217;s aber mal nicht. Das werd ich aber sicherlich demn\u00e4chst noch erfahren &#8230;<\/p>\n<p class=\"wp-flattr-button\"><a href=\"https:\/\/blog.benny-baumann.de\/?flattrss_redirect&amp;id=374&amp;md5=e2555d6c66fa92680eb33ae5fa34dc7a\" title=\"Flattr\" target=\"_blank\"><img src=\"http:\/\/blog.benny-baumann.de\/wp-content\/plugins\/flattr\/img\/flattr-badge-large.png\" srcset=\"http:\/\/blog.benny-baumann.de\/wp-content\/plugins\/flattr\/img\/flattr-badge-large.png\" alt=\"Flattr this!\"\/><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Eigentlich hat mal wieder alles wie \u00fcblich harmlos angefangen. Eigentlich ging es mir nur darum, die Funktionen von RRDTool in meinen Scripten nutzen zu k\u00f6nnen, ohne auf Prozesssteuerbefehle wie system, exec, popen &#038; Co. zur\u00fcckgreifen zu m\u00fcssen, da diese auf meinem Server aus gutem Grund deaktiviert sind. Daf\u00fcr begab ich mich nun auf die Suche, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[29],"tags":[98,228,13,229,21],"class_list":["post-374","post","type-post","status-publish","format-standard","hentry","category-software","tag-developement","tag-extensions","tag-patch","tag-pecl","tag-php"],"_links":{"self":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/374","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=374"}],"version-history":[{"count":1,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/374\/revisions"}],"predecessor-version":[{"id":375,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/374\/revisions\/375"}],"wp:attachment":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=374"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=374"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=374"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}