Andreas Korthaus: Sourcen

Beitrag lesen

Hoi!

Ersteinmal geht es mir nur um einen Test, ob und wie PHP darauf reagiert.

;-)

Dann, wenn keine Mucken auftreten, würde ich gerne (beim Beispiel bleibend) eine eigene Funktion mail() in PHP schreiben und die Funktion mit auto_append_file wieder anlegen.

Das würde ja wenig Sinn machen, aber vermutlich meinst Du auto_prepend_file. Ja, das sollte wohl funktionieren. Verstehe allerdings immer noch nicht den Sinn, warum man sowas wollen könnte ;-)

Bedenke was Du Dir damit an zusätzlichem Pflegeaufwand einhandelst, wenn PHP aktualisiert wird...

Das weiß ich und ich sehe es mit großer Sorge, allerdings muß ich das jetzt schon beim apachen...

Das wird vor allem schwierig wenn mal eine recht lange Zeit zwischen Updates  liegt, wenn jemand anders ein Update machen muss...

IMHO bringt sowas meist mehr Probleme als Nutzen. Den Source zu bearbeiten sollte meiner Meinung nach immer das allerletzte Mittel bleiben. Vielleicht könnte man das bei Gentoo per Portage-Overlay etwas vereinfachen, allerdings zweifele ich selbst daran. Vor allem wenn so ein Patch bei Updates angepasst werden muss dann hilft alles nichts. Wenn sich dann die Patches häufen wird das früher oder später eine ganz schon fiese Sache. Etwas besser wartbar wäre evtl. eine eigene PHP-Extension, die sich darum kümmert, das geht dann wenigstens so lange gut wie sich die API nicht ändert ;-)

Als Beispiel möchte ich die Funktion mail() entfernen.
Warum verwendest Du nicht einfach disable_function?

Vielleicht ist das einfach nur ein Denkfehler: Ich würde gerne eigene Funktionalitäten für mail() nutzen wollen, jedoch andere darüber im Unklaren lassen (so gut das mit get_defined_functions() halt machbar ist ;). Es soll also nur die Funktionalität geändert werden ohne einen Redeclare auszulösen, daher kommt nur einundderselbe Name in Frage. Gäbe es andere Möglichkeiten?

Du kannst in einer Extension auch Funktionen überschreiben. xdebug macht das z.B. mit der Funktion var_dump(), die bei xdebug schön buntes HTML ausgibt (was nebenbei bemerkt sehr angenehm beim debuggen ist).

Ich weiß nicht ob das der vollständige Code ist, aber folgende Zeilen haben auf jeden Fall was damit zu tun:

 zend_hash_find(EG(function_table), "var_dump", 9, (void **)&orig);  
 orig->internal_function.handler = zif_xdebug_var_dump;  

So könntest Du halt eine eigene kleine Extension schreiben, die entsprechendes mit mail() macht. Wäre sicher eine nette Übung ;-) Der Vorteil wäre, dass eben diese Extension auch bei einem Update nicht verändert werden muss. Solange die API sich nicht ändert (kommt nicht wirklich oft vor...) kann man die Extension als .so im Verzeichnis liegen haben, und per php.ini einbinden.

Wie so eine Extension erstellt wird:

http://cvs.php.net/co.php/php-src/ext/skeleton/  (veraltet) http://cvs.php.net/pecl/PECL_Gen/ (aktuell, mit manual)

Ich weiß allerdings nicht wie man eine Standard-Funktion aus einer Extension heraus deaktiviert, vor allem so dass sie von einer User-Funktion überschrieben werden kann. Möglich dass das geht. Bei der xdebug Variante müsstest Du Deine neue Mail-Funktion in C implementieren, was nicht immer so witzig ist ;-)

Grüße
Andreas

--
SELFHTML Tipps & Tricks: http://aktuell.de.selfhtml.org/tippstricks/