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.

Kommentar verfassen