Foros del Web » Programando para Internet » PHP »

como saber si file_get_contents falla

Estas en el tema de como saber si file_get_contents falla en el foro de PHP en Foros del Web. Hola, abro una conexión a una pagina web para obtener unos datos mediante file_get_contents, pero aveces por saturación del servidor no me responde y directamente ...
  #1 (permalink)  
Antiguo 19/12/2010, 09:43
 
Fecha de Ingreso: junio-2006
Ubicación: España
Mensajes: 122
Antigüedad: 17 años, 10 meses
Puntos: 2
como saber si file_get_contents falla

Hola, abro una conexión a una pagina web para obtener unos datos mediante file_get_contents, pero aveces por saturación del servidor no me responde y directamente me sale un error, y claro me descuadra la pagina, de que manera podria comprobar la conexión antes para que no me de esos fallos?

la conexion la hago asi
$xml=file_get_contents($url);

gracias,
  #2 (permalink)  
Antiguo 19/12/2010, 09:55
 
Fecha de Ingreso: diciembre-2010
Ubicación: Rosario, Santa Fe
Mensajes: 326
Antigüedad: 13 años, 4 meses
Puntos: 13
Respuesta: como saber si file_get_contents falla

http://ar.php.net/manual/es/function.file-get-contents.php

Si miras las documentación dice claramente que en caso de error devuelve FALSE, entonces podemos hacer algo así:
Código PHP:
$xml=file_get_contents($url); 
if(
$xml) {
  
//CASO EXITOSO
}else{
  
//ERROR

También el problema puede ser que tu petición se ejecute, pero el resultado guardado en $xml sea ese html del error. En ese caso, viendo que tu variable es xml, supongo que es xml el contenido, así que poder ver si hace errores de parseo para comprobar, o sino con alguna expresión regular o comparación ver si es error o no.
  #3 (permalink)  
Antiguo 19/12/2010, 14:25
 
Fecha de Ingreso: junio-2006
Ubicación: España
Mensajes: 122
Antigüedad: 17 años, 10 meses
Puntos: 2
Respuesta: como saber si file_get_contents falla

sí, lo sé, ya lo habia probado y no me funciona, por eso he escrito, el mensaje de error es un warning y me dice la linea de codigo donde tengo el
$xml=file_get_contents($url);

el mensaje me sale si pongo la url mal (aposta), pero tengo que tenerlo en cuenta porque aveces tengo comprobado que el servidor donde hago la petición no me responde y aunque la url este bien falla y me sale el mismo mensaje de error como si lo pusiera mal.

Warning: file_get_contents(http://localhost/pagina2/datos.xml?objeto=12) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in C:\xampp\htdocs\pagina2\obtenerdatos.php on line 5

adjunto el codigo

Código PHP:
Ver original
  1. function obtenerdatos($dato){  
  2.      
  3.      $xml=file_get_contents('http://localhost/pagina2/datos.xml?objeto=12'.$dato);  
  4.      if ($xml)
  5.      {//correcto
  6.         if (preg_match('/precio>(.*)</',$xml,$match)!=0)
  7.          {  
  8.                  $count = $match[1];  
  9.           return $count;  
  10.                  }  
  11.      }
  12.      else
  13.      {
  14.      return 0;
  15.      }

y para llamar la funcion he probado asi

Código PHP:
Ver original
  1. if (obtenerdatos($id)==0)
  2.         {
  3.         echo ("mal");
  4.         }
  #4 (permalink)  
Antiguo 20/12/2010, 05:54
 
Fecha de Ingreso: junio-2006
Ubicación: España
Mensajes: 122
Antigüedad: 17 años, 10 meses
Puntos: 2
Respuesta: como saber si file_get_contents falla

he visto ejemplos que hacen la comprobación mediante curl, pero claro, de esta manera tendria que hacer 2 conexiones, 1 para mirar si esta bien y luego otra si esa ha funcionado, pero de esta manera tengo que hacer 2 conexiones, y de esta manera va a tardar mucho más en hacerme la operación.....

alguien sabe como hacerlo con el ejemplo que tengo?

gracias.
  #5 (permalink)  
Antiguo 20/12/2010, 06:36
 
Fecha de Ingreso: diciembre-2010
Ubicación: Rosario, Santa Fe
Mensajes: 326
Antigüedad: 13 años, 4 meses
Puntos: 13
Respuesta: como saber si file_get_contents falla

Se vuelve a algo que se repite siempre, una cosa es el servidor de pruebas y otra muy distinta el de producción. En el de prueba se muestran todos los mensajes, en el de producción ninguno y todo depende del manejo interno de tu programa.
Con esto lo que quiero decir que tenes 3 opciones, seteas el reporte de errores para que no tire la adventencia (error_reporting), usas un bloque para manejo de errores (try/catch) y aplicas una función de manejo de errores.
Supongamos que aplicamos la segunda:
Código PHP:
function obtenerdatos($dato){  
     try {
       
$xml=file_get_contents('http://localhost/pagina2/datos.xml?objeto=12'.$dato);  
       if (
$xml)
       {
//correcto
          
if (preg_match('/precio>(.*)</',$xml,$match)!=0
           {  
              
$count $match[1];  
              return 
$count;  
           }  
       }
       else
       {
          return 
0;
       }
     }catch (
Exception $e) {
           echo 
'Error: ',  $e->getMessage(), "\n";
           return 
false;
     } 
En el caso de la primera:
Código PHP:
function obtenerdatos($dato){  
     
$level error_reporting(E_NONE);
     
$xml=file_get_contents('http://localhost/pagina2/datos.xml?objeto=12'.$dato);  
     if (
$xml)
     {
//correcto
        
if (preg_match('/precio>(.*)</',$xml,$match)!=0
         {  
                 
$count $match[1];  
                  
error_reporting($level);
                  return 
$count;  
                 }  
     }
     else
     {
     
error_reporting($level);
     return 
0;
     } 
  #6 (permalink)  
Antiguo 20/12/2010, 06:48
 
Fecha de Ingreso: diciembre-2010
Mensajes: 32
Antigüedad: 13 años, 3 meses
Puntos: 1
Respuesta: como saber si file_get_contents falla

lmerli, te paso una función con curl para hacer lo que necesitas. Y no es necesario dos conexiones...

Código PHP:
function getPage($url) {
    
$session curl_init($url);
    
curl_setopt($sessionCURLOPT_HEADERfalse);
    
curl_setopt($sessionCURLOPT_RETURNTRANSFERtrue);
    
curl_setopt($sessionCURLOPT_FOLLOWLOCATION1);
    
curl_setopt($sessionCURLOPT_MAXREDIRS1);    
    
$response curl_exec($session); 
    
$estado curl_getinfo($session);
    
curl_close($session);
    
    return array(
$response$estado['http_code']);  


Como resultado te dara un array, puedes hacer algo asi para obtenerlo más claro:

Código PHP:
list($xml$code) = getPage("urldelxml.com"); 
El $code te indicará el response code de la página, googlealo y verás los resultados posibles. En general, debería devolver 200 si no tiene redirect.

El $response será el resultado que esperas ( el xml ).
  #7 (permalink)  
Antiguo 20/12/2010, 07:49
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: como saber si file_get_contents falla

El problema es que al no poder abrir el documento php te advierte y a la vez te envia false. Para evitar el mensaje de error, solo pasa el simbolo @ antes de la función, algo así
Código PHP:
Ver original
  1. <?php
  2. if($xml=@file_get_contents('http://localhost/asa.php')){
  3.     echo $xml;
  4. }else{
  5.     echo 'error';
  6. }
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #8 (permalink)  
Antiguo 20/12/2010, 10:27
 
Fecha de Ingreso: junio-2006
Ubicación: España
Mensajes: 122
Antigüedad: 17 años, 10 meses
Puntos: 2
Respuesta: como saber si file_get_contents falla

muchas gracias a todos por vuestros mensajes, me he guiado por el primer ejemplo que me ha puesto el usuario areslepra, que con este he podido hacer lo que queria, mirar si se conecta bien y/o si la id del producto era valida.

gracias a todos otra vez, un saludo y felices fiestas.

Etiquetas: falla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:40.