2014-04-15 12 views
18

Ich habe mit HHVM config-Datei gespielt und ich habe es noch in der Lage, es alle fatalen Fehler an den Browser ausgeben zu lassen. Es zeigt E_NOTICE und E_WARNING an, aber wenn ein E_ERROR auftritt, wird die Seite leer gelassen und der Fehler wird nur in der HHVM-Protokolldatei angezeigt.hhvm-fastcgi + nginx wie man es fatale Fehler im Browser anzeigen lassen kann

Gibt es eine Möglichkeit, es im Browser anzeigen zu lassen?

Meine HHVM Konfigurationsdatei ist wie folgt:

PidFile = /var/run/hhvm/pid 

Log { 
    Level = Warning 
    AlwaysLogUnhandledExceptions = true 
    RuntimeErrorReportingLevel = 8191 
    UseLogFile = true 
    UseSyslog = false 
    File = /var/log/hhvm/error.log 
    InjectedStackTrace = false 
    NativeStackTrace = false 
    Access { 
    * { 
     File = /var/log/hhvm/access.log 
     Format = %h %l %u % t \"%r\" %>s %b 
    } 
    } 
} 

ErrorHandling { 
    CallUserHandlerOnFatals = true 
    NoInfiniteLoopDetection = false 
    NoInfiniteRecursionDetection = false 
    ThrowBadTypeExceptions = false 
    ThrowNotices = false 
    NoticeFrequency = 1 # 1 out of these many notices to log 
    WarningFrequency = 1 # 1 out of these many warnings to log 
    AssertActive = false 
    AssertWarning = false 
} 

Debug { 
    FullBacktrace = false 
    ServerStackTrace = false 
    ServerErrorMessage = false 
    TranslateSource = false 

    RecordInput = false 
    ClearInputOnSuccess = true 

    ProfilerOutputDir = /tmp 

    CoreDumpReport = true 
    CoreDumpReportDirectory = /tmp 
} 

Http { 
    DefaultTimeout = 30 # in seconds 
    SlowQueryThreshold = 5000 # in ms, log slow HTTP requests as errors 
} 

Mail { 
    SendmailPath = sendmail -t -i 
    ForceExtraParameters = 
} 

Preg { 
BacktraceLimit = 100000 
RecursionLimit = 100000 
} 

Repo { 
    Central { 
    Path = /var/log/hhvm/.hhvm.hhbc 
    } 
} 

Eval { 
    Jit = true 
} 

MySQL { 
    TypedResults = false 
    ReadOnly = false 
    ConnectTimeout = 2000  # in ms 
    ReadTimeout = 2000   # in ms 
    SlowQueryThreshold = 2000 # in ms, log slow queries as errors 
    KillOnTimeout = false 
} 

Nginx:

location ~ \.php$ { 
    fastcgi_keep_conn on; 

    fastcgi_buffers 8 16k; 
    fastcgi_buffer_size 32k; 
    fastcgi_read_timeout 900; 
    fastcgi_send_timeout 900; 
    fastcgi_intercept_errors off; 

    fastcgi_pass 127.0.0.1:9000; 

    fastcgi_index index.php; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    include  fastcgi_params; 
} 
+0

Ich habe { FullBacktrace = true ServerStackTrace = true ServerErrorMessage = true TranslateSource = true } und auch wenn einige Informationen, um die __file__ zeigt und __LINE__ Informationen nicht zeigen. – Satake

+0

Wie wäre es mit dem PHP-Ende? Haben Sie die Anzeige aller Fehler aktiviert? – Sina

+0

Vielen Dank für Ihre Antwort. Ja am PHP-Ende habe ich \t \t \t error_reporting (E_ALL); und ini_set ('display_errors', 1) ;. Wie gesagt, es ist nur der E_ERROR, den ich nicht bekomme. – Satake

Antwort

2

Sie müssen die Konfiguration hhvm.server.implicit_flush in Ihrem php.ini aktivieren, dann können Sie eine Antworttext bei schwerwiegenden Fehlern senden. Um fatale Fehler mit einem Fehlerhandler abfangen zu können, sollten Sie auch hhvm.error_handling.call_user_handler_on_fatals aktivieren.

Weitere Informationen finden Sie unter github issue on hhvm. auch versucht, mit Debug

1

Verwenden Sie ein custom error handler jede Art von Fehler zu behandeln genau so, wie Sie es wollen. im Code genommen fast direkt von Beispiel # 1 in dem Link ...

function myErrorHandler($errno, $errstr, $errfile, $errline) 
{ 

    switch ($errno) { 
    case E_USER_ERROR: 
     echo "<b>My ERROR</b> [$errno] $errstr<br />\n"; 
     echo " Fatal error on line $errline in file $errfile"; 
     echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; 
     echo "Aborting...<br />\n"; 
     exit(1); 
     break; 

    case E_USER_WARNING: 
     echo "<b>My WARNING</b> [$errno] $errstr<br />\n"; 
     break; 

    case E_USER_NOTICE: 
     echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; 
     break; 

    default: 
     echo "Unknown error type: [$errno] $errstr<br />\n"; 
     break; 
    } 

    /* Don't execute PHP internal error handler */ 
    return true; 
} 

set_error_handler("myErrorHandler"); 

Für diesen Ansatz zu arbeiten, müssen Sie so früh wie möglich, die Fehlerbehandlung eingestellt.

Wie Sie vielleicht bemerkt haben, habe ich einen Code weggelassen, nämlich denjenigen, der prüft, ob der Fehlertyp für die Berichterstattung in Ihrer php/hhvm-Konfiguration konfiguriert ist. Mit dem obigen Code werden die Fehler unabhängig von Ihrer php/hhvm-Konfiguration angezeigt. (So ​​möchten Sie wahrscheinlich statt echo Fehler in der Produktionsumgebung Hinweis anmelden)

Verwandte Themen