2013-02-13 12 views
8

Ho un server dedicato con decine di host virtuali. Voglio determinare quale file sta chiamando la funzione mail() e registrarlo globalmente. Ho bisogno di qualcosa di simile:Come registrare tutte le chiamate su una funzione in PHP? (funzione mail())

[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 

non posso usare debug_backtrace() o simili perché non posso aggiungere questo a qualsiasi file PHP nel server. Posso registrare tutte le chiamate di funzione globalmente in un file come errori registrati in un file come error.log?

Grazie

+1

Il modo più semplice sarebbe quello di creare la propria funzione, come "sendMail", la strega registra le azioni e invia la posta. – Peon

+0

Può http://xdebug.org/ o http://code.google.com/p/webgrind/ aiutarti? – Stephan

+1

xdebug offre tale funzionalità, sebbene l'abilitazione globale di traccia su tutti i tuoi vhost potrebbe non essere una buona idea per quanto riguarda le prestazioni. – Jon

risposta

3

In generale, si sta andando ad avere problemi con questo; PHP non fornisce un meccanismo di registrazione integrato, quindi è necessario aggiungere qualcosa al sistema PHP per farlo.

Le opzioni come la vedo io:

  1. Modificare il codice PHP. Dato quello che hai detto nella domanda, immagino che questa non sia un'opzione, ma deve essere dichiarata, poiché è la risposta ovvia. (Funzione di PHP mail() è così fondamentale che chiunque codice PHP a scrivere davvero dovrebbe essere utilizzando una classe wrapper per lo stesso solo per mantenere la loro sanità mentale)

  2. Se stiamo parlando specificamente sulla funzione mail(), allora potremmo registrarlo registrando al client sendmail le chiamate mail(). Il sistema sendmail sul server è probabilmente controllato da uno script shell unix chiamato dalla funzione PHP mail(). Dovresti essere in grado di modificare questo script di shell per registrare gli eventi di posta. Probabilmente questo non sarà in grado di fornirti dettagli come il numero di riga, ma ti dirà all'utente che lo sta facendo, ecc.

  3. Utilizzare Suhosin PHP hardening patch. Questa è una patch per PHP che fornisce dozzine di funzionalità relative alla sicurezza; Lo raccomanderei caldamente per un ambiente di hosting condiviso comunque. Ma per te include anche lo logging features, che potrebbe consentire di registrare l'utilizzo di determinate funzioni, tra cui nome file e numero di riga, ovvero esattamente lo scenario che stai cercando. Questa è la soluzione che consiglierei .... l'unico grosso problema che avremo qui è se hai mantenuto aggiornata la tua versione di PHP, perché Suhosin è attualmente disponibile solo per PHP 5.3, non per 5.4. Come sviluppatore PHP, spingerei per ottenere PHP 5.4 sul mio server, ma come fornitore, 5.3 è ancora supportato, quindi non c'è niente di sbagliato in questo. (Il rovescio della medaglia, se sei ancora su 5.2, dovresti eseguire l'aggiornamento al più presto, dato che non è supportato da anni e ha falle nella sicurezza).

+0

Grazie a SDC, ho provato a impostare sendmail_path ma non mi dice quale file sta chiamando la funzione mail(). Ma sto usando Suhosin, quindi darò un'occhiata alle funzionalità di registrazione, sembra essere esattamente ciò di cui ho bisogno. Grazie! – Jose

0

Che cosa si può fare è, scaricare il codice sorgente php, modificare questo file:

ext/standard/mail.c 

e aggiungere logger lì.

Quindi ricompilare.

Probabilmente è solo il modo in cui è possibile eseguire il debug implicito di chi chiama la funzione php da dove.

0

Per bloccare mail() è sufficiente eliminare/usr/sbin/sendmail dal chroot di php e forzare lo smtp autenticato.

2

A partire da> = PHP 5.3.0, si può semplicemente specificare un percorso nella posizione desiderata della vostra logilfe nel vostro php.ini:

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

Vedere la PHP docs per i dettagli.

Problemi correlati