2011-06-16 16 views
16

Quiero asegurarme de que no haya condiciones de carrera introducidas al usar a custom PHP error handler. Para ese fin, quiero saber si puedo confiar en error_log() o si necesito utilizar algún otro método de bloqueo de archivos para asegurar que los errores se registran correctamente.¿Es segura la función PHP error_log()?

¿Cómo funciona el controlador predeterminado de errores de PHP? ¿Está a salvo de las condiciones de carrera?

Por ejemplo, tengo que bloquear el archivo (que podría ocasionar errores que se pierde en esta versión simple)

function log_error($message) 
{ 
    if(! $fp = @fopen('/path/to/error.log', 'a')) 
    { 
     return FALSE; 
    } 

    flock($fp, LOCK_EX); 
    fwrite($fp, $message); 
    flock($fp, LOCK_UN); 
    fclose($fp); 

    return TRUE; 
} 

o puedo llamar error_log?

error_log($message, 0); 
+1

error_log ($ mensaje, 0) utilizará la directiva http://php.net/error-log, por lo que debe configurarla correctamente. Si usa syslog allí, entonces debería estar bien: http://stackoverflow.com/questions/1163194/syslog-r-for-linux, pero debe verificar la versión de syslog en nuestro sistema (seguro en la mayoría de los sistemas). – XzKto

Respuesta

16

Puede encontrar la fuente para la implementación error_log en ext/standard/basic_functions.c. Verás que prácticamente llama a cualquier registrador definido. Si le preocupa algún tipo de corte de datos por error_log debido a múltiples llamadas concurrentes, no es necesario. O al menos, no más preocupado que la mayoría de cualquier otra pieza de código PHP. Si su registrador personalizado está escribiendo en un archivo, deberá implementar el bloqueo de archivos usted mismo. Llamadas concurrentes a error_log (en todos los procesos) es un escenario bastante común.

edición

Usted es casi seguro que mejor usar el construido en el registro disponibles a través de error_log.

La implementación de grupos de PHP utiliza el bloqueo de aviso, lo que hace posible que otros procesos simplemente ignoren el bloqueo y la escritura. Además, dentro de sus propios procesos terminará siendo IO obligado a medida que el proceso espera para adquirir el bloqueo. Al usar error_log, puede configurar el registro de syslog. Syslog es asincrónico por lo que evita la adquisición de bloqueo, y también está respaldado (generalmente) por un búfer de kernel que permitirá que cualquier daemon syslog escriba registros consecutivos sin problemas.

Después de haber implementado el registro de alto rendimiento en varias compañías, recomiendo encarecidamente configurar syslog o ir con algo como scribe. Mi 2c.

+0

Entonces, ¿puedo llamar a error_log() desde mi controlador o necesito crear otro archivo de registro que pueda bloquear y usar en su lugar? Si el manejador de PHP predeterminado simplemente llama a error_log() entonces me siento seguro usando eso en mi controlador. – Xeoncross

+2

El registrador basado en archivos que se puede especificar a través de php.ini (error_log = '/tmp/log.txt') se escribirá con seguridad incluso con llamadas concurrentes. Puede llamar a error_log() en su controlador. – bmatheny

+0

Creo que es seguro. –

Cuestiones relacionadas