( jc – 21.03.2011 15:52)
PHP: casual error_reporting via Geektool & Growl
Nachdem ich regelmäßig das Problem hatte, mir mit irgendwo willkürlich gesetzten und dann im Code vergessenen display_error Direktiven selbst das Leben schwer zu machen – ein per script ausgegebenes JS mit notices dazwischen ist z.b. schlicht kaputt – habe ich über alternative Wege nachgedacht, wie ich die PHP Fehlermeldung jederzeit und einfach im Blick haben, und gleichzeitig aber automatisch über auftretende Fehler informiert werden könnte..
Geektool & Growl
Während Growl in der Mac-Gemeinde schon fast als Standard angesehen werden kann, führt Geektool eher ein Nischendasein.. Geektools Kern-Funktion ist das Anzeigen von Daten auf dem Desktop. Dafür kann Geektool verschiedene Quellen anzapfen, u.a. anderem eben auch logfiles.
Die Einrichtung von Geektool ist ziemlich selberklärend, insofern will ich da nicht groß drauf eingehen, für meine Zwecke habe ich (siehe screenshot) 3 logfiles von MAMP angezapft: Apache, MySQL und eben PHP.
LaunchAgent -> Bash script -> Growl
Der etwas trickreichere Teil ist es Growl so einzurichten, daß es einem PHP Fehlermeldungen ausgibt. Die Grundfunktionaltität und deren Einrichtung wird in diesem Artikel hinreichend beschrieben: how-to-get-growl-notifications-from-crashplan D.h. ich zeige hier nur noch die Unterschiede hinsichtlich kleinerer Details wie der konkreten MAMP Pfade, bzw. einen kleinen edit am bash script, der einen (10.5.8 spezifischen?) bug umschifft, wo Fehlermeldungen öfters mal doppelt an Growl gesendet werden.
Das bash script
Das script ist für die spezifischen MAMP Pfade angepaßt, und dahingehend aufgebohrt (thx an tk btw.), daß wg. des erwähnten bugs die Fehlermeldung mit der vohergehenden verglichen wird, um sicherzustellen, daß einunddieselbe Fehlermeldung eben nicht doppelt ausgegeben wird. Das script habe ich hier bei mir unter folgendem Pfad gespeichert:
/Users/USERNAME/bin/tail_php_error_log_to_growl
#!/bin/bash
touch /tmp/php_error.log
test -L /tmp/php_error.log && (echo "Detected symlink. Exiting" >&2; exit 1)
RecentLog="$(tail -n1 /Applications/MAMP/logs/php_error.log)"
read PreviousLog </tmp/php_error.log
if [ "X${RecentLog}" != "X${PreviousLog}" ]; then
echo "${RecentLog}" >/tmp/php_error.log
/usr/local/bin/growlnotify -a MAMP -m "${RecentLog}"
fi
LaunchAgent einrichten
In besagtem Artikel wird das Prozedere beschrieben die erforderliche XML (plist) Datei zu Fuß per Editor zu erstellen. Wer es etwas komforabler mag, kann dafür auch Peter Borg’s Lingon benutzen (siehe screenshot). Lingon kümmert sich dabei um das korrekte XML Gerüst der plist Datei, und man gibt nur noch ein paar Pfade an..
Workflow im Alltag
Ich benutze diese Lösung seit ein paar Wochen, und bin insgesamt ziemlich zufrieden.. sie tut was ich brauche, nervt nicht, und der Saustall bzw. selbstverschuldeten Probleme mit display_errors gehören der Vergangenheit an.
Poppt eine Fehlermeldung (oder mehrere) in Growl auf, sehe ich sofort worums geht, und wenn ich etwas mehr wissen will, dann wische ich kurz alle Fenster beiseite, und sehe was in den 3 relevanten logs so los ist. Netter Nebeneffekt ist, daß man auf diese Weise auch notices/warnings mitbekommt, die einem unter anderen Umständen nicht auffallen würden, bzw. die nur unter ganz speziellen Bedingungen auftreten.. was über kurz oder lang schlicht zu saubererem Code führt.
Grenzen der Lösung
Ganz klar.. sonderlich sophisticated ist das ganze nicht, aber das soll es auch nicht sein.. ich nenn es mal “casual everyday error_reporting”. Auch eignet es sich weniger – zumindest der Growl-Teil – für Situationen wo es Fehlermeldungen hagelt.. denn dann pflastert einem Growl irgendwann einfach den Bildschirm zu. Das PHP error_reporting auf STRICT zu stellen sollte man mit Redaxo <5 z.b. mal schön sein lassen.. ;-)
