2013-02-13 4 views
8

Ich habe einen dedizierten Server mit Dutzenden von virtuellen Hosts. Ich möchte feststellen, welche Datei mail() Funktion aufruft und diese global aufzeichnen. Ich brauche etwas wie folgt aus:Wie protokolliert man alle Aufrufe einer Funktion in PHP? (mail() Funktion)

[Wed Feb 13 10:42:39 2013] mail() called from /var/www/example1.php on line 70 
[Wed Feb 13 10:42:40 2013] mail() called from /var/www/example2.php on line 70 

ich nicht debug_backtrace() oder ähnliches verwenden kann, weil ich dies zu einer PHP-Datei auf dem Server nicht hinzufügen können. Kann ich alle Funktionsaufrufe global in einer Datei protokollieren, wie Fehler in einer Datei wie error.log protokolliert werden?

Dank

+1

Der einfachste Weg wäre, eine eigene Funktion wie 'sendMail' zu erstellen, die Aktionen protokolliert und Mail sendet. – Peon

+0

Kann http://xdebug.org/ oder http://code.google.com/p/webgrind/ Ihnen helfen? – Stephan

+1

xdebug bietet eine solche Funktionalität, obwohl die globale Verfolgung aller vhosts möglicherweise keine gute Idee für die Leistung ist. – Jon

Antwort

3

Im Allgemeinen werden Sie Schwierigkeiten damit haben; PHP bietet keinen eingebauten Logging-Mechanismus, daher müssen Sie etwas zu Ihrem PHP-System hinzufügen, um dies zu tun.

Die Optionen wie ich es sehe:

  1. den PHP-Code ändern. Angesichts dessen, was Sie in der Frage gesagt haben, denke ich, dass dies keine Option ist, aber es muss gesagt werden, da es die offensichtliche Antwort ist. (mail() Funktion PHP ist so einfach, dass jemand zu schreiben PHP-Code sollte wirklich eine Wrapper-Klasse für sie sein, mit ohnehin nur ihre geistige Gesundheit behalten)

  2. Wenn wir speziell über die mail() Funktion sprechen, dann könnten wir es log indem Sie den sendmail-Client protokollieren, der mail() aufruft. Ihr sendmail System auf dem Server wird wahrscheinlich von einem Unix-Shell-Skript gesteuert, das von PHPs mail()-Funktion aufgerufen wird. Sie sollten in der Lage sein, dieses Shell-Skript zu ändern, um die Mail-Ereignisse zu protokollieren. Dies wird wahrscheinlich nicht in der Lage sein, Ihnen Details wie die Zeilennummer zu geben, aber es wird Ihnen den Benutzer sagen, der es macht, etc.

  3. Verwenden Sie die Suhosin PHP hardening patch. Dies ist ein Patch für PHP, der Dutzende von sicherheitsrelevanten Funktionen bietet; Ich würde es auf jeden Fall für eine gemeinsame Hosting-Umgebung empfehlen. Aber für Sie enthält es auch logging features, mit dem Sie die Verwendung bestimmter Funktionen protokollieren können, einschließlich Dateiname und Zeilennummer - also genau das Szenario, nach dem Sie suchen. Dies ist die Lösung, die ich empfehlen würde .... das einzige große Problem, das Sie hier haben, ist, wenn Sie Ihre PHP-Version auf dem neuesten Stand halten, denn Suhosin ist derzeit nur für PHP 5.3, nicht 5.4 verfügbar. Als PHP-Entwickler würde ich PHP 5.4 auf meinem Server installieren, aber als Provider wird 5.3 immer noch unterstützt, also ist nichts falsch daran. (auf der anderen Seite, wenn Sie noch auf 5.2 sind, sollten Sie so schnell wie möglich upgraden, da es jahrelang nicht unterstützt wurde und Sicherheitslücken aufweist).

+0

Dank SDC, habe ich versucht, sendmail_path zu setzen, aber es sagt mir nicht, welche Datei mail() Funktion aufruft. Aber ich benutze Suhosin, also werde ich mich um Logging-Funktionen kümmern, scheint genau das zu sein, was ich brauche. Vielen Dank! – Jose

0

Was können Sie tun, ist, herunterladen PHP-Quellcode, bearbeiten Sie diese Datei:

ext/standard/mail.c 

und Logger dort hinzufügen.

Dann neu kompilieren.

Das ist wahrscheinlich nur so können Sie implizit debuggen, wer Ihre PHP-Funktion von wo aus ruft.

0

Um mail() zu blockieren einfach löschen/usr/sbin/sendmail von php chroot und erzwingen authentifizierte smtp.

2

Ab> = PHP 5.3.0, können Sie einfach einen Weg an die gewünschte Stelle Ihres logilfe in Ihrem php.ini angeben:

mail.log = /path/to/some/logfile 

die PHP docs für Details.