Foros del Web » Programando para Internet » PHP »

file_get_contents falla

Estas en el tema de file_get_contents falla en el foro de PHP en Foros del Web. Hola!!, estoy usando file_get_contents para obtener unos datos de una página web que está en XML, aveces funciona bien, otras no y devuelve error en ...
  #1 (permalink)  
Antiguo 28/09/2011, 09:39
 
Fecha de Ingreso: marzo-2002
Mensajes: 299
Antigüedad: 22 años, 1 mes
Puntos: 1
file_get_contents falla

Hola!!, estoy usando file_get_contents para obtener unos datos de una página web que está en XML, aveces funciona bien, otras no y devuelve error en la línea donde tengo la instrucción SimpleXMLElement que es la que estoy utilizando para hacer el parseo del XML.

El error es el siguiente:

Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in C:\datos\pages\consulta.php:202 Stack trace: #0 C:\datos\pages\consulta.php(202): SimpleXMLElement->__construct('') #1 {main} thrown in

Por lo que he leído dice que se debe a que aveces se satura el servidor remoto.

Hay alguna forma de verificar que es por esto??, y qué servidor es el saturado el de hosting o el remoto de que quiero leer la página??

Desde ya gracias por su atención y ayuda

Saludos
  #2 (permalink)  
Antiguo 28/09/2011, 09:48
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: file_get_contents falla

Muestranos tu código a ver en que te podemos ayudar.

Puedes empezar capturando esa excepción, a ver si manejas el error, en el caso de que el servidor esté saturado:

Código PHP:
Ver original
  1. <?php
  2. try {
  3.     //Tu código
  4. } catch (Exception $e) {
  5.     echo 'Error que quieras ' . $e->getMessage();
  6. }

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #3 (permalink)  
Antiguo 28/09/2011, 10:05
 
Fecha de Ingreso: marzo-2002
Mensajes: 299
Antigüedad: 22 años, 1 mes
Puntos: 1
Respuesta: file_get_contents falla

Gracias Andrés,

Este es el código:

$xml_get=file_get_contents("http://xml.travel.com/xml/getQuoteHotels?r1k3a=$r1k3a&r2a=$r2a&r2k=$r2k&r2k1 a=$r2k1a&r2k2a=$r2k2a&r2k3a=$r2k3a&r3a=$r3a&r3k=$r 3k&r3k1a=$r3k1a&r3k2a=$r3k2a&r3k3a=$r3k3a&r4a=$r4a &r4k=$r4k&r4k1a=$r4k1a&r4k2a=$r4k2a&r4k3a=$r4k3a&r 5a=$r5a&r5k=$r5k&r5k1a=$r5k1a&r5k2a=$r5k2a&r5k3a=$ r5k3a&d=$d&l=ESP&co=MX");

$xml = new SimpleXMLElement($xml_get);

foreach($xml->hotels->hotel as $item){
$hoteles[] = array("idhotel"=>(int)$item->hotelid, "hotelname"=>(string)($item->hotelname),"ciudad"=>(string)$item->cityname,"ubicacionid"=>(string)$item->ubicationid,"categoria"=>(string)$item->categoryid,"tarifaneta"=>(int)$item->rooms->Roomrates->rate);
}


Incluyendo el Try que me sugieres devolvió:

Error String could not be parsed as XML
  #4 (permalink)  
Antiguo 28/09/2011, 16:42
 
Fecha de Ingreso: marzo-2002
Mensajes: 299
Antigüedad: 22 años, 1 mes
Puntos: 1
Respuesta: file_get_contents falla

Alguna otra sugerencia??,

file_get_contents solamente devuelve falso o verdadero, en caso de que devuelva falso hay alguna forma de saber por qué no pudo resolver??

Gracias
  #5 (permalink)  
Antiguo 28/09/2011, 16:54
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: file_get_contents falla

Dudo mucho que ese error sea por la función file_get_contents, ya que no te está marcando ningún error. El error que te muestra es en la clase SimpleXMLElement y tal vez se debe ese enredo de variables que tienes. El error lo puedes capturar para mandarle un mensaje al usuario cuando no se pueda leer. Como te dije en mi primer respuesta. Intenta colocar un ejemplo real para ir probando el error.

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #6 (permalink)  
Antiguo 28/09/2011, 18:05
 
Fecha de Ingreso: marzo-2002
Mensajes: 299
Antigüedad: 22 años, 1 mes
Puntos: 1
Respuesta: file_get_contents falla

Gracias Andrés!!,

Cierto es un enredadero lo de las variables a la url, pero esas son todas las que se solicitan para resolver esa petición, omití otras más.

Considero que es en file_get_contents porque cuado la pongo así:

if($xml_get=@file_get_contents("http://xml.e-travelsolution.com/xml/enginexml-agencies.asmx/getQuoteHotels?a=k4r3n-4n3l&pwd=5ecr370&c=PE&sd=20111111&ed=20111116&h=&r t=&mp=&r=1&r1a=2&r1k=0&r1k1a=-1&r1k2a=-1&r1k3a=-1&r2a=-1&r2k=-1&r2k1a=-1&r2k2a=-1&r2k3a=-1&r3a=-1&r3k=-1&r3k1a=-1&r3k2a=-1&r3k3a=-1&r4a=-1&r4k=-1&r4k1a=-1&r4k2a=-1&r4k3a=-1&r5a=-1&r5k=-1&r5k1a=-1&r5k2a=-1&r5k3a=-1&d=2&l=ESP&categoryid=&locationid=&chainid=&cityi d=&fq=&co=MX")){;

$xml = new SimpleXMLElement($xml_get);

foreach($xml->hotels->hotel as $item){
$hoteles[] = array("idhotel"=>(int)$item->hotelid, "hotelname"=>(string)($item->hotelname),"ciudad"=>(string)$item->cityname,"ubicacionid"=>(string)$item->ubicationid,"categoria"=>(string)$item->categoryid,"tarifaneta"=>(int)$item->rooms->Roomrates->rate);
}
}else{
echo "Error en file_get_contents";
}


De esta forma manda el mensaje de "Error en file_get_contents", osea que el file_get_contents devolvió false.

Como te comentaba inicialmente aveces si resuelve, otras no.

Gracias por tu atención y apoyo.
  #7 (permalink)  
Antiguo 28/09/2011, 18:10
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: file_get_contents falla

Debe haber algún error en la URL porque la página me marca este error:

System.InvalidOperationException: Missing parameter

que falta un parámetro o parámetros. Revisala

Edit: más exactamente te falta el parámetro rt

arreglando el parámetro rt y city_id me di cuenta que lo que pasa lo que decias en un inicio, ese servidor está muy saturado. Demora siglos para devolver el archivo XML. Puedes establecer un tiempo límite y mostrar un error en caso de que se esté demorando mucho... En el ejemplo tiene un límite de 10 segundos. Si pasan los 10 segundos u ocurre algún error mostrará el mensaje "Lo sentimos el servidor esta ocupado en este momento":

Código PHP:
Ver original
  1. <?php
  2. array('http' => array('timeout' => 10))); //timeout
  3.  
  4. $xml_get = @file_get_contents("http://xml.e-travelsolution.com/xml/enginexml-agencies.asmx/getQuoteHotels?a=k4r3n-4n3l&pwd=5ecr370&c=PE&sd=20111111&ed=20111116&h=&rt=&mp=&r=1&r1a=2&r1k=0&r1k1a=-1&r1k2a=-1&r1k3a=-1&r2a=-1&r2k=-1&r2k1a=-1&r2k2a=-1&r2k3a=-1&r3a=-1&r3k=-1&r3k1a=-1&r3k2a=-1&r3k3a=-1&r4a=-1&r4k=-1&r4k1a=-1&r4k2a=-1&r4k3a=-1&r5a=-1&r5k=-1&r5k1a=-1&r5k2a=-1&r5k3a=-1&d=2&l=ESP&categoryid=&locationid=&chainid=&cityid=&fq=&co=MX",
  5. 0, $context);
  6.  
  7. if ($xml_get) {
  8.    
  9.     $xml = new SimpleXMLElement($xml_get);
  10.    
  11.     foreach ($xml->hotels->hotel as $item) {
  12.         $hoteles[] = array("idhotel" => (int) $item->hotelid,
  13.         "hotelname" => (string) ($item->hotelname), "ciudad" => (string) $item->cityname,
  14.         "ubicacionid" => (string) $item->ubicationid, "categoria" => (string) $item->categoryid,
  15.         "tarifaneta" => (int) $item->rooms->Roomrates->rate);
  16.     }
  17.    
  18.     echo '<pre>';
  19.     print_r($hoteles);
  20.     echo '</pre>';
  21.  
  22. } else {
  23.     echo "Lo sentimos el servidor esta ocupado en este momento";
  24. }

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP

Última edición por andresdzphp; 28/09/2011 a las 18:37
  #8 (permalink)  
Antiguo 28/09/2011, 19:42
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: file_get_contents falla

También deberías de quitar el @ a file_get_contents, ya que precisamente eso evita que veas la causa del error.
  #9 (permalink)  
Antiguo 29/09/2011, 08:21
 
Fecha de Ingreso: marzo-2002
Mensajes: 299
Antigüedad: 22 años, 1 mes
Puntos: 1
Respuesta: file_get_contents falla

Gracias a los dos por su ayuda.

Pero, entonces no hay forma de saber si el servidor remoto devuelve algún error??, o simplemente es porque está muy saturado y no resuelve esa petición.

Buen día
  #10 (permalink)  
Antiguo 29/09/2011, 17:13
 
Fecha de Ingreso: marzo-2002
Mensajes: 299
Antigüedad: 22 años, 1 mes
Puntos: 1
Respuesta: file_get_contents falla

No encuentro explicación a esto, por qué si en la barra del dirección del explorador pongo la url:

http://xml.e-travelsolution.com/xml/...yid=&fq=&co=MX

si resuelve, he hecho 20 veces la prueba y en las 20 ha resuelto, aveces se tarda mucho pero siempre ha resuelto.

Y si solicito leer ese resultado con file_get_contents:

Código PHP:
Ver original
  1. <?
  2. $xml_get=@file_get_contents("http://xml.e-travelsolution.com/xml/enginexml-agencies.asmx/getQuoteHotels?a=smatra1&pwd=jurica&c=PE&sd=20111111&ed=20111116&h=&rt=&mp=&r=1&r1a=2&r1k=0&r1k1a=-1&r1k2a=-1&r1k3a=-1&r2a=-1&r2k=-1&r2k1a=-1&r2k2a=-1&r2k3a=-1&r3a=-1&r3k=-1&r3k1a=-1&r3k2a=-1&r3k3a=-1&r4a=-1&r4k=-1&r4k1a=-1&r4k2a=-1&r4k3a=-1&r5a=-1&r5k=-1&r5k1a=-1&r5k2a=-1&r5k3a=-1&d=&l=ESP&categoryid=&locationid=&chainid=&cityid=&fq=&co=MX");
  3.  
  4. if ($xml_get) {
  5. $xml = new SimpleXMLElement($xml_get);
  6.  
  7. foreach ($xml->hotels->hotel as $item) {
  8. $hoteles[] = array("idhotel" => (int) $item->hotelid,"hotelname" => (string) ($item->hotelname), "ciudad" => (string) $item->cityname,
  9. "ubicacionid" => (string) $item->ubicationid, "categoria" => (string) $item->categoryid,
  10. "tarifaneta" => (int) $item->rooms->Roomrates->rate);
  11. }
  12.  
  13. echo '<pre>';
  14. print_r($hoteles);
  15. echo '</pre>';
  16.  
  17. }
  18. else {
  19.   echo "No disponible";
  20. }
  21. ?>

Aveces si resuelve, aveces no, de 20 pruebas resuelve 8.

A qué se debe que en el Explorador de Internet Si y ya incluído en página no??

Gracias por su ayuda
  #11 (permalink)  
Antiguo 29/09/2011, 17:27
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: file_get_contents falla

Quita la arroba (@) para que veas los errores! Supongo que el explorador si espera, pero la función PHP no, dependiendo de tu configuración

failed to open stream: HTTP request failed!

Eso devuelve cuándo está saturado.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #12 (permalink)  
Antiguo 29/09/2011, 17:46
 
Fecha de Ingreso: marzo-2002
Mensajes: 299
Antigüedad: 22 años, 1 mes
Puntos: 1
Respuesta: file_get_contents falla

Ok, ya quité la arroba, sólo que quito, pongo, agrego para ver como se comporta, gracias.

Cuando dices

Cita:
Iniciado por andresdzphp Ver Mensaje
Supongo que el explorador si espera, pero la función PHP no, dependiendo de tu configuración
Te refieres al tiempo de espera en PHP, actualmente el max_execution_time de php.ini lo tengo en 180 segundos.

pero aveces no llega a ese tiempo y ya marca error.
  #13 (permalink)  
Antiguo 29/09/2011, 17:54
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: file_get_contents falla

Pues no es culpa de PHP que ese servidor esté tan saturado y tarde tanto en devolver un XML tan pequeño. Después de un tiempo devuelve false así tengas max_execution_time sin límite.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #14 (permalink)  
Antiguo 29/09/2011, 18:04
 
Fecha de Ingreso: marzo-2002
Mensajes: 299
Antigüedad: 22 años, 1 mes
Puntos: 1
Respuesta: file_get_contents falla

Eso si, tienes mucha razón.

Gracias Andrés por tu valiosísimo apoyo.

Saludos.
  #15 (permalink)  
Antiguo 29/09/2011, 18:06
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: file_get_contents falla

Haciendo esta prueba demora siglos en devolver el XML (hasta 15 minutos) y aveces se demora 3 segundos...

Código PHP:
Ver original
  1. <?php
  2.  
  3. $context = stream_context_create(array('http' => array('timeout' => 889))); //timeout
  4.  
  5. $xml_get = file_get_contents(
  6. "http://xml.e-travelsolution.com/xml/enginexml-agencies.asmx/getQuoteHotels?a=k4r3n-4n3l&pwd=5ecr370&c=PE&sd=20111111&ed=20111116&h=&rt=&mp=&r=1&r1a=2&r1k=0&r1k1a=-1&r1k2a=-1&r1k3a=-1&r2a=-1&r2k=-1&r2k1a=-1&r2k2a=-1&r2k3a=-1&r3a=-1&r3k=-1&r3k1a=-1&r3k2a=-1&r3k3a=-1&r4a=-1&r4k=-1&r4k1a=-1&r4k2a=-1&r4k3a=-1&r5a=-1&r5k=-1&r5k1a=-1&r5k2a=-1&r5k3a=-1&d=2&l=ESP&categoryid=&locationid=&chainid=&cityid=&fq=&co=MX",
  7. 0, $context);
  8.  
  9. $xml = new SimpleXMLElement($xml_get);
  10.  
  11. foreach ($xml->hotels->hotel as $item) {
  12.     $hoteles[] = array("idhotel" => (int) $item->hotelid,
  13.     "hotelname" => (string) ($item->hotelname), "ciudad" => (string) $item->cityname,
  14.     "ubicacionid" => (string) $item->ubicationid, "categoria" => (string) $item->categoryid,
  15.     "tarifaneta" => (int) $item->rooms->Roomrates->rate);
  16. }
  17.  
  18. echo '<pre>';
  19. print_r($hoteles);
  20. echo '</pre>';
  21.  
  22. if ($xml_get) {
  23.  
  24. } else {
  25.     echo "No disponible";
  26. }
  27. ?>

Yo colocaría el límite de tiempo como te dije en mi post # 7, cuando se demore mucho colocar un mensaje y ya. Seguiré investigando, cualquier cosa te aviso.

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #16 (permalink)  
Antiguo 30/09/2011, 00: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, 11 meses
Puntos: 1517
Respuesta: file_get_contents falla

Algo que se puede hacer es como indica andres, colocar un tiempo, pero añadiría que haga al menos tres veces la petición, con algo así
Código PHP:
Ver original
  1. <?php
  2. //ini_set('default_socket_timeout', 10);
  3. $context = stream_context_create(array('http' => array('timeout' => 10))); //timeout
  4. $xml_get = @file_get_contents("http://xml.e-travelsolution.com/xml/enginexml-agencies.asmx/getQuoteHotels?a=k4r3n-4n3l&pwd=5ecr370&c=PE&sd=20111111&ed=20111116&h=&rt=&mp=&r=1&r1a=2&r1k=0&r1k1a=-1&r1k2a=-1&r1k3a=-1&r2a=-1&r2k=-1&r2k1a=-1&r2k2a=-1&r2k3a=-1&r3a=-1&r3k=-1&r3k1a=-1&r3k2a=-1&r3k3a=-1&r4a=-1&r4k=-1&r4k1a=-1&r4k2a=-1&r4k3a=-1&r5a=-1&r5k=-1&r5k1a=-1&r5k2a=-1&r5k3a=-1&d=2&l=ESP&categoryid=&locationid=&chainid=&cityid=&fq=&co=MX", 0, $context);
  5.  
  6. if(!empty($xml_get)) {
  7.     $xml = new SimpleXMLElement($xml_get);
  8.     foreach ($xml->hotels->hotel as $item) {
  9.         $hoteles[] = array("idhotel" => (int) $item->hotelid,
  10.         "hotelname" => (string) ($item->hotelname), "ciudad" => (string) $item->cityname,
  11.         "ubicacionid" => (string) $item->ubicationid, "categoria" => (string) $item->categoryid,
  12.         "tarifaneta" => (int) $item->rooms->Roomrates->rate);
  13.     }
  14.     echo '<pre>';
  15.     print_r($hoteles);
  16.     echo '</pre>';
  17. }else{
  18.     $_SESSION['counter'] = !empty($_SESSION['counter']) ? ($_SESSION['counter'] + 1) : 1;
  19.     if($_SESSION['counter'] >= 3){
  20.         $_SESSION = array();
  21.         if (ini_get("session.use_cookies")) {
  22.             $params = session_get_cookie_params();
  23.             setcookie(session_name(), '', time() - 42000,
  24.                 $params["path"], $params["domain"],
  25.                 $params["secure"], $params["httponly"]
  26.             );
  27.         }
  28.         session_destroy();
  29.         echo "Lo sentimos el servidor esta ocupado en este momento";
  30.     }else{
  31.         header('Location: b.php');
  32.     }
  33. }
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 30/09/2011 a las 00:58

Etiquetas: falla, file_get_contents, webservice, xml
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 11:51.