2009-05-29 18 views
15

La función mkdir de PHP solo devuelve verdadero y falso. El problema es cuando devuelve falso.¿Cómo encontrar un motivo cuando mkdir falla en PHP?

Si estoy ejecutando informes de errores habilitados, veo el mensaje de error en la pantalla. También puedo ver el mensaje de error en el registro de Apache. Pero me gustaría tomar el texto del mensaje y hacer algo más con él (por ejemplo, enviarlo por mensajería instantánea). ¿Cómo obtengo el texto de error?

Actualización: Siguiendo la idea de Ayman, llegué a esto:

function error_handler($errno, $errstr) { 
    global $last_error; 
    $last_error = $errstr; 
} 

set_error_handler('error_handler'); 
if (!mkdir('/somedir')) 
    echo "MKDIR failed, reason: $last_error\n"; 
restore_error_handler(); 

Sin embargo, no me gusta porque utiliza variable global. ¿Alguna idea para una solución más limpia?

+0

respuesta de Soulmerge es una mejor opción porque le informa sobre el error sin reemplazar el controlador. –

+4

Tenga en cuenta que los controladores de errores se almacenan en una pila en PHP, lo que significa que la llamada a restore_error_handler() restaurará el controlador de errores anterior, ya sea el controlador incorporado u otro controlador personalizado. Por lo tanto, no hay pérdida en el reemplazo temporal del controlador de errores con set_error_handler(). – soulmerge

Respuesta

42

Puede suppress the warning y hacer uso de error_get_last():

if ([email protected]($dir)) { 
    $error = error_get_last(); 
    echo $error['message']; 
} 
+5

+1, pero vale la pena señalar que esto es potencialmente frágil si se produce otro error entre mkdir() y error_get_last(), que bien puede suceder cuando el código se vuelve más complejo (como un ejemplo extremo, poco realista, se podría ejecutar una función tic y generar un error antes de su llamada error_get_last()). Esto siempre es un riesgo cada vez que usa cualquier tipo de función de obtener el último error. –

14

usted podría utilizar excepciones:

instalación de algún código de este modo:

function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 
} 
set_error_handler("exception_error_handler"); 

Y luego simplemente hacer:

try { 
    mkdir('/somedir'); 
} catch(ErrorException $ex) { 
    echo "Error: " . $ex->getMessage(); 
} 

Eso debería hacer lo que quieras.

Si desea conservar el gestor de errores php, a continuación, después de que el bloque intento de captura, simplemente llame a:

restore_error_handler() 
+0

+1 Me gusta este enfoque, no lo he probado pero se siente sólido. También se ve más amigable;) –

+2

Además, las bibliotecas OO de PHP se ocupan de todo esto mucho mejor http://www.php.net/manual/en/class.splfileobject.php –

+1

@nickfox mkdir no arroja una excepción , ese es el motivo del controlador de error personalizado que arroja una excepción. En cuanto a las bibliotecas OO de PHP, sí, probablemente lo hagan mejor. – Kazar

3

utilizo algo como lo siguiente:

if(! @mkdir('$fileLocation', 0777, $recursive = true)){ 
    $mkdirErrorArray = error_get_last(); 
    throw new Exception('cant create directory ' .$mkdirErrorArray['message'], 1); 
}