Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Foreach y datos externos

Estas en el tema de Foreach y datos externos en el foro de PHP en Foros del Web. Wenas gente,,, Tengo un programa en el cual se pueden agregar jugadores a una base de datos, en sí no tiene errores de funcionamiento sino ...
  #1 (permalink)  
Antiguo 18/02/2015, 13:50
Avatar de Maganius  
Fecha de Ingreso: septiembre-2010
Mensajes: 310
Antigüedad: 14 años, 1 mes
Puntos: 10
Foreach y datos externos

Wenas gente,,,

Tengo un programa en el cual se pueden agregar jugadores a una base de datos, en sí no tiene errores de funcionamiento sino que el problema se basa en la gran demora de la execución del mismo.

Mi script sigue este camino.

form -> web externa -> servidor bd

Para catpurar los datos de la web externa utilizo file_get_contents para despues parsear los datos capturados y los devuelvo en forma de array.

Lo que hace el script es ir a la web externa verificar que el jugador existe y en tal caso lo envia al servidor para guardarlo, pero este proceso demora mucho si se escriben varios jugadores y se envian al mismo tiempo.

Como máximo puedo escribir 30 jugadores (linea por linea en un textarea) si escribo más ya la página me da error de timeout.

La ídea es que se puedan escribir 100 o más jugadores sin tener ningun tipo de problema.

Les dejo la parte del código la cual se encarga de verificar y agregar a la base de datos

Código PHP:
Ver original
  1. $list = explode("\n",$jugadores);
  2.         foreach($list as $l){
  3.             $l = trim($l);
  4.             if($this->checkMaker($l)==0) //Verifica que el jugador no exista en la base de datos
  5.             {
  6.                 $t = new jugador();
  7.                 //Verificar que el jugador existe
  8.                 if($t->characterInfo($this->fixName($l))!="no" && (!empty($l)))
  9.                 {                
  10.                     $select = $this->db->prepare("INSERT INTO jugadores (nombre) VALUES (?)");
  11.                     $select->bindValue(1,$l);
  12.                     if($select->execute())
  13.                         $agregados[] = $l;
  14.                     else
  15.                         $no_agregados[] = $l;
  16.                 }else
  17.                     $no_agregados[] = $l;
  18.             }else
  19.             {
  20.                 $ya_existen[] = $l;
  21.             }
  22.         }

Que me aconsejan?
  #2 (permalink)  
Antiguo 18/02/2015, 14:14
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Foreach y datos externos

¿La web externa que consultas no dispone de un servicio web para el caso?

¿Cómo es que estás haciendo la petición a la web externa?

¿Has pensado en usar algún tipo de cache?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 18/02/2015, 14:57
Avatar de Maganius  
Fecha de Ingreso: septiembre-2010
Mensajes: 310
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: Foreach y datos externos

Hola Pateketrueke, gracias por contestar

¿La web externa que consultas no dispone de un servicio web para el caso?
.- No tiene.

¿Cómo es que estás haciendo la petición a la web externa?
.- Pongo el script que utilizo, si necesitas que también te pase la url avisame que te envio un mp.

¿Has pensado en usar algún tipo de cache?
.- No puedo obtener la información como cache ya que los datos tienen que ser del momento, ya que además de verificar si el jugador existe también verifico si esta online.

Código PHP:
Ver original
  1. $html = file_get_contents($url);
  2.         $domd = $this->getDOMDocument($html);
  3.  
  4.         $domx = new \DOMXPath($domd);
  5.         $characters = $domx->query("//table[@class='TableContent'][1]//tr[position() > 1]");
  6.         $ret = array();
  7.  
  8.         foreach ($characters as $character) {
  9.             $name     = $domx->query("td[2]/a[@href]", $character)->item(0)->nodeValue;
  10.             $level    = $domx->query("td[4]", $character)->item(0)->nodeValue;
  11.             $vocation = $domx->query("td[3]", $character)->item(0)->nodeValue;
  12.             $online = $domx->query("td[6]", $character)->item(0)->nodeValue;
  13.  
  14.             $ret[] = array(
  15.                 "name"      =>  $name,
  16.                 "level"     =>  $level,
  17.                 "vocation"  =>  $vocation,
  18.                 "status"  =>  $online,
  19.             );
  20.         }
  21.  
  22.         return $ret;
  #4 (permalink)  
Antiguo 18/02/2015, 15:05
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Foreach y datos externos

Ahora entiendo, ¿entonces tampoco es posible obtener todos los usuarios en una sola petición?

Porque veo que estás haciendo scrapping, y si dicho sitio es así de dinámico me lamento que no puedes hacer mucho: tendrás que atenerte a los problemas de latencia y múltiples peticiones.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 18/02/2015, 15:47
Avatar de Maganius  
Fecha de Ingreso: septiembre-2010
Mensajes: 310
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: Foreach y datos externos

No, no se pueden obtener todos los usuarios en una sola petición.

Para evitar el error del timeout solamente sería mediante ajax con un progressbar?, o existe otra posibilidad?.

Se que aumentando el tiempo de timeout, pero lo dejaria en página blanca durante mucho tiempo y puede que cierre o vuelva del navegador cortando la conexión con el servidor.
  #6 (permalink)  
Antiguo 18/02/2015, 15:55
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Foreach y datos externos

Definitivamente puedes hacer petición por petición, y llevar el control mediante Javascript, porque sencillamente no podrás resolverlo únicamente con PHP.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 18/02/2015, 16:16
Avatar de Maganius  
Fecha de Ingreso: septiembre-2010
Mensajes: 310
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: Foreach y datos externos

Muchas gracias pateketrueke

Etiquetas: externos, foreach, select
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 08:28.