PHP Errors und Zend_Log incl. Mail verheiraten

Über die Bootstrap hab ich mir meinen Logger konfiguriert und in die Registry abgelegt. Ungefähr so:

public function _initLogger()
{        
    $configIni = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini', $this->getEnvironment());

    // Konsolenlog initialisieren
    $writerStream = new Zend_Log_Writer_Stream('php://output');
    $writerStream->addFilter((int) $configIni->log->console->level);

    // Mail-Logging initialisieren
    $configMail = array(
        'auth'      => 'login',
        'username'  => $configIni->mail->smtp->user,
        'password'  => $configIni->mail->smtp->pass,
        'ssl'       => 'tls',
        'port'      => $configIni->mail->smtp->port
    );

    $smtp = new Zend_Mail_Transport_Smtp($configIni->mail->smtp->host, $configMail);
    $mail = new Zend_Mail('utf-8');
    $mail->setFrom($configIni->log->mail->from)
         ->addTo($configIni->log->mail->to)
         ->addCc($configIni->log->mail->cc)
         ->setSubject('Fehlermeldungen:')
         ->setDefaultTransport($smtp);

    $writerMail = new Zend_Log_Writer_Mail($mail);
    $writerMail->addFilter((int) $configIni->log->mail->level);

    // Writer zum Logger hinzufügen
    $logger = new Zend_Log();
    $logger->addWriter($writerStream);
    $logger->addWriter($writerMail);
    Zend_Registry::set('logger', $logger);
}

Das entsprechende PHP Script required die index.php und bootstrapped so das Zend Framework. Das Script soll im Fehler bzw. Abbruchfall einen Fehler in den Logger schreiben und ebenfalls die Logger-Mail versenden.

require_once __DIR__ . '/index.php';
declare(ticks=1);

function shutdown()
{
    if ($error = error_get_last()) {
        if (isset($error['type']) && ($error['type'] == E_ERROR ||
                $error['type'] == E_PARSE ||
                $error['type'] == E_COMPILE_ERROR)
        ) {
            ob_end_clean();

            $message = 'Es ist ein Fehler aufgetreten: ' . "\n"
                . 'Message: ' . $error['message'] . "\n"
                . 'File: ' . $error['file'] . "\n"
                . 'Line: ' . $error['line'];
            /* @var $logger Zend_Log */
            $logger = Zend_Registry::get('logger');
            $logger->log($message, Zend_Log::CRIT);
            $logger->__destruct();
        }
    }
}

//// signal handler function
function sig_handler($signo)
{
    switch ($signo) {
        case SIGTERM:
        case SIGINT:
        case SIGHUP:
        case SIGUSR1:
            $message = 'Es ist ein Fehler aufgetreten';
            /* @var $logger Zend_Log */
            $logger = Zend_Registry::get('logger');
            $logger->log($message, Zend_Log::CRIT);
            $logger->__destruct();
            exit;
        default:
            // handle all other signals
    }
}

register_shutdown_function('shutdown');

Hervorzuheben und wichtig sind hier die Zeilen declare(ticks=1); sowie $logger->__destruct();. Mit dem Destruktor vom Logger initialisiert ihr das Versenden der Mail, da das Script selber nicht korrekt beendet wurde und die destruct-Funktion vom Logger somit auch nicht aufgerufen wurde.

Zend Tutorial – 05 – View Helper

Um Layout- & Viewscripte zu entschlacken und von Programmcode zu befreien (MVC-Prinzip), gibt es in Zend die Möglichkeit View-Helper einzusetzen. View Helper können auch dazu verwendet werden, um wiederkehrenden Code in seperaten Dateien abzulegen und somit doppelten Code zu vermeiden.

Ich erkläre das Prinzip beispielhaft für das Einbinden eines Copyrights incl. Jahreszahl (bspw.: © 2005 – 2011).
Weiterlesen →

Zend Tutorial – 03 – Weitere Actions

1. In diesem Teil des Tutorials wagen wir uns an weitere Actions und somit auch an eine Erweiterung unserer Anwendung. Ziel ist es, unseren IndexController um die Funktionen des Anlegens, Bearbeitens und Löschens zu erweitern. Wir werden auch mit den Zend_Forms in Berührung kommen, die uns die Arbeit mit Formularen vereinfachen sollen.
Weiterlesen →

Zend Tutorial – 02 – Datenbankhandling

1. Die Dateien, die für den Datenbankzugriff verantwortlich sind, sollen sich im Modulordner „bibo“ im Unterordner „models“ befinden. Dieser Ordner ist aktuell noch leer. Das wird sich recht schnell ändern. Legt im Ordner application/modules/bibo/models einen Unterordner „DbTable“ an. Achtet auch auf die casesensitive Schreibweise. In diesem Ordner machen wir jede Tabelle seperat bekannt.
Weiterlesen →

Zend Tutorial – 01 – Erste Schritte

1. Eclipse öffnen -> File -> New -> PHP Project

  • Project name: Bibotest
  • Create project at existing location (from existing source) auswählen
  • Pfad angeben: *\projects\bibotest\htdocs\bibotest
  • Finish drücken
  • Nun habt Ihr eure erste Zend Applikation in Eclipse eingebunden.

* ist euer Pfad zum Projekt
2. Erstellt werden soll ein simples Bibliotheksystem mit Bücheransicht, Bücherausleihe und der Möglichkeit Bücher anzulegen, zu bearbeiten und zu löschen. Desweiteren soll eine Möglichkeit existieren den Buchbestand zu durchsuchen. In einem zweiten Schritt soll eine simple Benutzerverwaltung integriert werden.
Weiterlesen →