2009-09-01 28 views

Respuesta

40

Como has dicho, si se utiliza en un archivo no existente, getimagesize genera una advertencia:

este código:

if ($data = getimagesize('not-existing.png')) { 
    echo "OK"; 
} else { 
    echo "NOT OK"; 
} 

le conseguirá una

Warning: getimagesize(not-existing.png) [function.getimagesize]: 
    failed to open stream: No such file or directory 


Una solución sería utilizar el @ operator, para enmascarar ese error:

if ($data = @getimagesize('not-existing.png')) { 
    echo "OK"; 
} else { 
    echo "NOT OK"; 
} 

Como no existe el archivo, los datos todavía será $ falsa; pero no se mostrará ninguna advertencia.


Otra solución sería check if the file exists, antes de usar getimagesize; algo como esto haría:

if (file_exists('not-existing.png') && 
    ($data = getimagesize('not-existing.png')) 
    ) { 
    echo "OK"; 
} else { 
    echo "NOT OK"; 
} 

Si no existe el archivo, getimagesize no se llama - lo que significa que ninguna advertencia

Sin embargo, esta solución no es el que se debe utilizar para las imágenes que se encuentran en otro servidor, y se accede a través de HTTP (si es así en este caso), ya que significará dos solicitudes al servidor remoto.

Para imágenes locales, eso estaría bastante bien, supongo; El único problema que veo es el aviso generado cuando hay un error de lectura que no se enmascara.


Por último:

  • I permitiría errores que se mostrarán en su servidor Developpement,
  • Y no se mostraban los de su servidor de producción - ver display_errors, por eso ;-)
+4

Eso sí, si file_exists() dice que el archivo existe, getimagesize() todavía puede fallar, ya que el archivo puede eliminarse justo entre llamadas a métodos. Veeery poco probable, pero sucede en los peores momentos ... – ya23

+1

@ ya23: cierto; pero no deberías tener mucha suerte ^^ Y no me gusta enmascarar errores con @: si lo estás usando y tienes un problema, en general es difícil depurarlo rápidamente :-( –

+1

Bueno, creo que el @ es bastante sucio :) – Gigala

7

Llámame un zombie hacker sucio que se irá al infierno, pero normalmente soluciono este problema capturando la salida de advertencia en un búfer de salida y luego comprobando el búfer. Prueba esto:

ob_start(); 
$data = getimagesize('not-existing.png'); 
$resize_warning = ob_get_clean(); 
if(!empty($resize_warning)) { 
    print "NOT OK"; 
    # We could even print out the warning here, just as PHP would do 
    print "$resize_warning"; 
} else { 
    print "OK" 
} 

Como dije, no es la forma de conseguir un lugar acogedor en el cielo del programador, pero cuando se trata de la gestión de errores disfuncional, un hombre tiene que hacer lo que un hombre tiene que hacer.

+7

Eres un zombie hacker sucio que irá al infierno. – Seb

5

Lamento que se plantee un tema tan antiguo. Recientemente encontré un problema similar y encontré este tema en lugar de una solución. Por razones religiosas, creo que '@' es una mala decisión.Y entonces me encontré otra solución, se ve algo como esto:

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

try { 
    $imageinfo = getimagesize($image_url); 
} catch (Exception $e) { 
    $imageinfo = false; 
} 
Cuestiones relacionadas