Foros del Web » Programando para Internet » PHP »

SimpleXMLElement pesado

Estas en el tema de SimpleXMLElement pesado en el foro de PHP en Foros del Web. Hola, quería haceros una consulta. Cada vez que empleo el método SimpleXMLElement Código PHP: $xml  = new  SimpleXMLElement ( 'http://www.elpais.com/rss/feed.html?feedId=1022' ,  null ,  true );  me ...
  #1 (permalink)  
Antiguo 06/10/2011, 13:10
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años, 7 meses
Puntos: 15
SimpleXMLElement pesado

Hola, quería haceros una consulta. Cada vez que empleo el método

SimpleXMLElement

Código PHP:
$xml = new SimpleXMLElement('http://www.elpais.com/rss/feed.html?feedId=1022'nulltrue); 
me carga obviamente toda la web (digamos por ejemplo 30Kb, 70Kb...) de golpe en una variable.

Yo lo que hago es sacar varios post (pongamos unos 50) y si estimo que la mitad tienen links... serían 25 links por una media pongamos de 50 Kb...

Lo que te vengo a decir es que la página se ralentiza de forma importante. Se puede corregir esto de alguna forma? Es que veo que por ejemplo a fb no le pasa.

salu2 y gracias
  #2 (permalink)  
Antiguo 06/10/2011, 13:18
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: SimpleXMLElement pesado

Hay diferentes APIs para leer XMLs, en tu caso si los XMLs son pesados es mucho más recomendable usar el SAX Parser Aquí hay un ejemplo:

http://www.codemiles.com/php-tutoria...ion-t1436.html

Saludos.
  #3 (permalink)  
Antiguo 06/10/2011, 14:32
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años, 7 meses
Puntos: 15
Respuesta: SimpleXMLElement pesado

ok pero tengo el mismo problema (incluso aún peor) cuando quiero sacar el título, link, descripción e imagen de un link:


Código PHP:
Ver original
  1. $website = file_get_contents($url);
  2.  
  3. $patronlink = "#<title>(.*?)</title>#si";
  4. preg_match_all($patronlink,$website,$titlelink);
  5.                                
  6.                            
  7. $patrondescription = '#<meta name="description" content="(.*?)"#is';
  8. preg_match_all($patrondescription,$website,$descriptionlink);
  9.                                
  10. $patronpic = "#<link rel=\"image_src\" href=\"(.*?)\" />#";
  11. preg_match_all($patronpic,$website,$piclink);


hay alguna solución?
  #4 (permalink)  
Antiguo 06/10/2011, 14:40
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: SimpleXMLElement pesado

Eso es por el file_get_contents, debes de leer la pagina de forma secuencial para ir accesando poco a poco al elemento, de la forma que lo indicas es lo mismo que el SimpleXML, debes de tener todo el archivo en memoria y trabajar dentro de él...
  #5 (permalink)  
Antiguo 06/10/2011, 14:59
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años, 7 meses
Puntos: 15
Respuesta: SimpleXMLElement pesado

a qué te refieres con "debes de tener todo el archivo en memoria y trabajar dentro de él..."?

por otro lado, hay alguna otra forma de hacerlo? pq veo que facebook no tiene ese problema y me imagino que usa file_get_contents no?
  #6 (permalink)  
Antiguo 06/10/2011, 15:05
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: SimpleXMLElement pesado

Con file_get_contents, lo que haces es cargar todo el archivo destino en memoria, lo cual si los archivos son grandes causa la lentitud que describes.

Dudo mucho que Facebook use file_get_contents ya que es una función muy poco optimizada, y esta pensada para archivos pequeños locales.

La forma correcta ya te indique más arriba, es usar un SAX Parser y cargar el archivo por partes, de esa forma vas optimizando la lectura.

Ahora ten en cuenta que pedir el archivo desde HTTP toma tiempo, en hacer el request, lo mejor es hacer un "cacheo" del XML que quieres procesar de forma local y solo cada X tiempo definido refrescar ese cache.

Saludos.
  #7 (permalink)  
Antiguo 07/10/2011, 04:22
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años, 7 meses
Puntos: 15
Respuesta: SimpleXMLElement pesado

Ummm, tengo que reconocer que ando un poco "lost", podrías ponerme algún ejemplo?
  #8 (permalink)  
Antiguo 07/10/2011, 05:16
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: SimpleXMLElement pesado

¿Verificaste los ejemplos que están en el manual? Ahí tiene mucha información http://us2.php.net/manual/en/xml.examples.php
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Etiquetas: html, pesado, variables
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 05:22.