2014-04-15 36 views
18

Ben HHVM yapılandırma dosyası ile oynuyorsun ve ben tarayıcıya herhangi önemli hata o çıktı yapabilmek henüz ölümcül hataları göstermek nasıl. E_NOTICE ve E_WARNING öğelerini görüntüler, ancak herhangi bir E_ERROR gerçekleştiğinde, sayfayı boş bırakır ve hata yalnızca HHVM günlük dosyasında görünür.hhvm-fastcgi + nginx tarayıcının

tarayıcıda göstermek yapmak için bir yolu var mı?

Benim HHVM yapılandırma dosyası aşağıdaki gibidir:

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

Ben de hata yakalama denedim { FullBacktrace = true ServerStackTrace = true ServerErrorMessage = true TranslateSource = true } ve bazı bilgiler __FILE__ gösterir ve __SATIR__ bilgi göstermez bile. – Satake

+0

PHP ucu nasıl? tüm hataları görüntülemeyi etkinleştirdiniz mi? – Sina

+0

Cevabınız için teşekkür ederiz. Evet, PHP sonunda, \t \t \t error_reporting (E_ALL) var; ve ini_set ('display_errors', 1); Söylediğim gibi değil sadece E_ERROR olduğunu. – Satake

cevap

2

(böylece muhtemelen üretim ortamında ipucu içinde yankı hataların yerine giriş yapmak istiyorum). Bir hata işleyicisi ile önemli hataları yakalayabilmek için hhvm.error_handling.call_user_handler_on_fatals'u da etkinleştirmeniz gerekir. Ayrıntılar için

, github issue on hhvm bakın.

1

kullanın custom error handler hata her türünü işlemek için siz istediğiniz tam olarak yolu. çalışmak için bu yaklaşım için ...

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"); 

linkte örnek 1. neredeyse doğrudan ele alındığında, sen mümkün olduğunca erken kodunuzda hata işleyicisi ayarlamak gerekir.

fark olabilir gibi ben, dışarı hata türü php/hhvm yapılandırmasında raporlanması yapılandırılmışsa denetler yani bir kod bir bit bıraktı. Yukarıdaki kod ile php/hhvm yapılandırmanıza bakılmaksızın hatalar gösterilecektir. Sen, senin php.ini yapılandırmayı hhvm.server.implicit_flush etkinleştirmek için o zaman ölümcül hatalar durumunda bir tepki gövdesini gönderebilir ihtiyaç