¿Cómo puedo manejar la advertencia de la función file_get_contents() en PHP?

7 minutos de lectura

¿Como puedo manejar la advertencia de la funcion file get contents en
wasim

Escribí un código PHP como este

$site="http://www.google.com";
$content = file_get_content($site);
echo $content;

Pero cuando elimino “http://” de $site Recibo la siguiente advertencia:

Advertencia: file_get_contents (www.google.com)
[function.file-get-contents]: fallo al abrir Stream:

Lo intenté try y catch pero no funcionó.

  • También un enfoque interesante: stackoverflow.com/questions/6718598/…

    – Hugo Stieglitz

    19 de junio de 2012 a las 13:15

  • Relacionado: stackoverflow.com/q/2002610

    – FrozenFyr

    30 de junio de 2015 a las 19:35

  • Use try-catch con set_error_handler-function como se dice aquí stackoverflow.com/a/3406181/1046909

    – MingalevME

    9 de febrero de 2017 a las 12:05

  • Si elimina http:// de la URL, entonces está buscando un archivo “www.google.com” en su disco local.

    – Raulí Rajande

    14 de diciembre de 2017 a las 11:52

  • ¿Cómo puede esto obtener tanta atención y votos a favor? ¿Por qué eliminaría la información del protocolo? Incluso en 2008, tenías FTP y HTTPS.

    – Daniel W.

    13 de marzo de 2018 a las 12:54

1646966829 222 ¿Como puedo manejar la advertencia de la funcion file get contents en
Roel

Paso 1: comprueba el código de retorno: if($content === FALSE) { // handle error here... }

Paso 2: suprima la advertencia poniendo un operador de control de errores (es decir @) delante de la llamada a archivo_obtener_contenido():
$content = @file_get_contents($site);

  • Recuerde usar una comparación estricta: si ($contenido === FALSO). Si el archivo contiene “0”, generará un falso negativo.

    – Aram Kocharyan

    24 de junio de 2011 a las 3:48

  • Hola, esto no funcionó para mí, agregar @ todavía hace que E_WARNING sea capturado por algún controlador de error global (no el mío), y mi secuencia de comandos muere antes de que tenga la oportunidad de manejar el valor de retorno. ¿Algunas ideas? gracias

    – Sagi Mann

    22 de noviembre de 2012 a las 6:51

  • Efecto secundario detectado: si el archivo no existe, el script se detiene en la línea @file_get_contents.

    – Dax

    23 de diciembre de 2012 a las 13:42

  • Aunque la respuesta es muy antigua, todavía sugiero agregar una nota a su respuesta que use @ puede afectar negativamente al rendimiento. Vea esta respuesta en una publicación relacionada que explica bastante bien.

    – FrozenFyr

    30 de junio de 2015 a las 19:35

  • no hagas esto Simplemente suprime la advertencia de error. ¡Esto no es un manejo de errores! esto creará problemas en la depuración.

    – hola

    15 de julio de 2019 a las 8:56

¿Como puedo manejar la advertencia de la funcion file get contents en
enobrev

Tú también puedes configura tu controlador de errores como un función anónima que llama un Excepción y use un intento / captura en esa excepción.

set_error_handler(
    function ($severity, $message, $file, $line) {
        throw new ErrorException($message, $severity, $severity, $file, $line);
    }
);

try {
    file_get_contents('www.google.com');
}
catch (Exception $e) {
    echo $e->getMessage();
}

restore_error_handler();

Parece mucho código para detectar un pequeño error, pero si está usando excepciones en toda su aplicación, solo necesitaría hacer esto una vez, en la parte superior (en un archivo de configuración incluido, por ejemplo), y lo hará Convierta todos sus errores en Excepciones en todo momento.

  • @enobrev, ¿por qué pone el mismo valor tanto para el número de error como para la gravedad?

    – Pacerier

    16 de julio de 2013 a las 18:38

  • No hay una razón específica además de un medio para ofrecer algo útil en $exception->getCode(), ya que set_error_handler no ofrece una variable de número de error (desafortunadamente).

    – enobrev

    16 de julio de 2013 a las 19:42

  • @lolka_bolka porque file_get_contents no arroja una excepción, sino que arroja un error de php. Entonces, lo que hace este ejemplo es configurar un “controlador de errores” que detecta la mayoría de las instancias de errores de php y, en su lugar, convierte esos errores en excepciones. Aquí hay un ejemplo más moderno de los documentos: php.net/manual/es/…

    – enobrev

    1 oct 2015 a las 17:23


  • @enobrev No olvide restaurar el controlador de errores dentro de la función anónima antes de lanzar una excepción. La excepción se puede manejar y, en ese caso, el controlador todavía está configurado para lanzar esta excepción en particular que puede ser inesperada e introducir un comportamiento extraño y difícil de depurar cuando hay otro error en el manejo de excepciones.

    – Josef Sabl

    23 de octubre de 2017 a las 8:57


  • Recomendaría incluir la llamada restore_error_handler() en el bloque finalmente.

    – peschanko

    7 abr 2019 a las 10:00

1646966831 442 ¿Como puedo manejar la advertencia de la funcion file get contents en
Laurie

Mi forma favorita de hacer esto es bastante simple:

if (($data = @file_get_contents("http://www.google.com")) === false) {
      $error = error_get_last();
      echo "HTTP request failed. Error was: " . $error['message'];
} else {
      echo "Everything went better than expected";
}

Encontré esto después de experimentar con el try/catch de @enobrev arriba, pero esto permite un código menos largo (y IMO, más legible). Simplemente usamos error_get_last para obtener el texto del último error, y file_get_contents devuelve falso en caso de falla, por lo que un simple “si” puede detectarlo.

  • ¡Esta es la solución más fácil y mejor para este problema! tal vez hacerlo @file_get_contents para suprimir el informe de error al navegador.

    – EDP

    30 de diciembre de 2015 a las 8:36


  • Admito que entre todas las respuestas, esta es la única sensata, si la aumentamos para usar @file_get_contents para suprimir la advertencia y prueba el valor del resultado usando === FALSE.

    – kostix

    10 de febrero de 2016 a las 13:01

  • Esto desencadenará errores para las solicitudes exitosas que no devuelvan un cuerpo o que devuelvan uno que se evalúe como falso. Debiera ser if (false !== ($data = file_get_contents ()))

    – GordonM

    6 de junio de 2016 a las 9:49


  • La documentación no lo deja claro, pero usar @ puede causar error_get_last para devolver nada en mi experiencia

    –Glenn Schmidt

    30 de enero de 2017 a las 7:49

  • La primera condición es al revés. Si falso no es igual al resultado de la llamada a file_get_contents, entonces obtuvo algunos contenidos y no deberíamos estar buscando un error. ¡Estaba confundido al ver errores de la prueba anterior o al ver un error de que $error era nulo cuando realmente se encontró Google!

    – Roberto

    23 de enero de 2021 a las 17:15

Puede anteponer una @:
$content = @file_get_contents($site);

Esto suprimirá cualquier advertencia – ¡utilizar con moderación!. Ver Operadores de control de errores

Editar: cuando eliminas el ‘http://’ ya no estás buscando una página web, sino un archivo en tu disco llamado “www.google…”

Una alternativa es suprimir el error y también generar una excepción que pueda capturar más tarde. Esto es especialmente útil si hay múltiples llamadas a file_get_contents() en su código, ya que no necesita suprimirlas y manejarlas todas manualmente. En su lugar, se pueden realizar varias llamadas a esta función en un solo bloque try/catch.

// Returns the contents of a file
function file_contents($path) {
    $str = @file_get_contents($path);
    if ($str === FALSE) {
        throw new Exception("Cannot access '$path' to read contents.");
    } else {
        return $str;
    }
}

// Example
try {
    file_contents("a");
    file_contents("b");
    file_contents("c");
} catch (Exception $e) {
    // Deal with it.
    echo "Error: " , $e->getMessage();
}

PHP Cambiar claves de matriz
manoj sharma

function custom_file_get_contents($url) {
    return file_get_contents(
        $url,
        false,
        stream_context_create(
            array(
                'http' => array(
                    'ignore_errors' => true
                )
            )
        )
    );
}

$content=FALSE;

if($content=custom_file_get_contents($url)) {
    //play with the result
} else {
    //handle the error
}

Así es como lo hice… No hay necesidad de un bloque try-catch… La mejor solución es siempre la más simple… ¡Disfrútalo!

$content = @file_get_contents("http://www.google.com");
if (strpos($http_response_header[0], "200")) { 
   echo "SUCCESS";
} else { 
   echo "FAILED";
} 

  • -1: esto funciona si obtiene un error 404 o algo así, pero no si no puede conectarse al servidor (por ejemplo, un nombre de dominio incorrecto). creo $http_response_header no se actualiza en ese caso, ya que no se recibe ninguna respuesta HTTP.

    – Nathan Reed

    24 de marzo de 2013 a las 1:50


  • Como dijo @NathanReed, debe verificar que $content no sea falso (con ===) ya que eso es lo que se devuelve si la solicitud no se conecta en absoluto

    – Seb

    20 de enero de 2014 a las 9:25

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad