Foros del Web » Programando para Internet » PHP »

Ayuda con rendimiento

Estas en el tema de Ayuda con rendimiento en el foro de PHP en Foros del Web. Hola amigos Estoy trabajando en un proyecto de e-Commerce en en el cual debo desarrollar un script php para importar los productos que llegan en ...
  #1 (permalink)  
Antiguo 03/01/2011, 09:28
 
Fecha de Ingreso: julio-2010
Mensajes: 41
Antigüedad: 14 años, 4 meses
Puntos: 7
Pregunta Ayuda con rendimiento

Hola amigos
Estoy trabajando en un proyecto de e-Commerce en en el cual debo desarrollar un script php para importar los productos que llegan en un archivo xml a una bd en mysql. El principal problema que tengo es que en el xml llegan poco más de 32000 productos y el scrip tarda cerca de 1 hora en importarlos a la bd. Este es el código que lo hace, por favor si existe técnicas o mejoras en el código que mejore el rendimiento del script háganmelo saber.

Código PHP:
$xml_file 'products.xml';
if (
file_exists($xml_file)) {
    
$xml simplexml_load_file($xml_file);
} else {
    exit(
'Error al intentar abrir el fichero ' $xml_file);
}
$dbhost='localhost';
$dbusername='shop';
$dbuserpass='shop';
$dbname 'shop';
mysql_connect ($dbhost$dbusername$dbuserpass);
mysql_select_db($dbname) or die('Cannot select database');
/* Recorremos el XML */
$count 0;
foreach (
$xml->Product as $product) {
    
$Id=htmlentities(mysql_real_escape_string($product->Id), ENT_QUOTES);
    
$CategoryId=htmlentities(mysql_real_escape_string($product->CategoryId), ENT_QUOTES);
    
$CategoryName htmlentities(mysql_real_escape_string($product->CategoryName), ENT_QUOTES);
    
$Title=htmlentities(mysql_real_escape_string($product->Title), ENT_QUOTES);
    
$Brand=htmlentities(mysql_real_escape_string($product->Brand), ENT_QUOTES);
    
$PictureLocalFileName=htmlentities(mysql_real_escape_string($product->PictureLocalFileName), ENT_QUOTES);
    
$SKU htmlentities(mysql_real_escape_string($product->SKU), ENT_QUOTES);
    
$Price=htmlentities(mysql_real_escape_string($product->Price), ENT_QUOTES);
    
$PricePerUnit=htmlentities(mysql_real_escape_string($product->PricePerUnit), ENT_QUOTES);
    
$UnitName htmlentities(mysql_real_escape_string($product->UnitName), ENT_QUOTES);
    
$ShortDescription=htmlentities(mysql_real_escape_string($product->ShortDescription), ENT_QUOTES);
    
$Description=htmlentities(mysql_real_escape_string($product->Description), ENT_QUOTES);
    
$Nutrition htmlentities(mysql_real_escape_string($product->Nutrition), ENT_QUOTES);
    
$qry "INSERT INTO products(Id,CategoryId,CategoryName,Title,Brand,PictureLocalFileName,SKU,Price,PricePerUnit,UnitName,ShortDescription,Description,Nutrition) " .
            
" VALUES ('$Id', " .
            
"'$CategoryId', " .
            
"'$CategoryName', " .
            
"'$Title', " .
            
"'$Brand', " .
            
"'$PictureLocalFileName', " .
            
"'$SKU', " .
            
"'$Price', " .
            
"'$PricePerUnit', " .
            
"'$UnitName', " .
            
"'$ShortDescription', " .
            
"'$Description', " .
            
"'$Nutrition'" ")";
    
       
$result mysql_query($qry) or die(mysql_error());
       
   
$count++;
}
echo 
"<br/>";
echo 
"-------------------------------------------<br/>";
echo 
"Total de registros importados: $count properties<br/>";
echo 
"-------------------------------------------<br/>"
  #2 (permalink)  
Antiguo 03/01/2011, 09:41
 
Fecha de Ingreso: enero-2003
Mensajes: 38
Antigüedad: 21 años, 10 meses
Puntos: 0
Respuesta: Ayuda con rendimiento

naturalmente se va a demorar mucho tiempo en hacer tantos INSERT en la base de datos, el volumen de información es muy grande, si es información segura, probablemente no necesites usar mysql_real_escape_string además que ya está deprecada.
  #3 (permalink)  
Antiguo 03/01/2011, 09:49
Avatar de spider_boy  
Fecha de Ingreso: diciembre-2003
Ubicación: Chile
Mensajes: 1.855
Antigüedad: 20 años, 11 meses
Puntos: 89
Respuesta: Ayuda con rendimiento

Podrías reducirlo a un insert, haciendo algo como esto :

Código PHP:
Ver original
  1. $xml_products = array_map('mysql_real_escape_string', $xml->Product);
  2. $values = array();
  3. foreach($xml_products as $product) {
  4.     $values[] = "('$product->Id', '$product->CategoryId', 'etc...')";
  5. }
  6. $values_str = implode(',', $values);
  7.  
  8. $query = "INSERT INTO tabla (campos) VALUES ".$values_str;
  9. mysql_query($query);

Algo así se me ocurre, tendrías que probar si funciona.

Saludos.
__________________
Nunca te olvidaré mi negra hermosa. Te extraño demasiado.
  #4 (permalink)  
Antiguo 04/01/2011, 06:35
 
Fecha de Ingreso: julio-2010
Mensajes: 41
Antigüedad: 14 años, 4 meses
Puntos: 7
Respuesta: Ayuda con rendimiento

Muchas gracias por responder, probare a ver qué tal.

Saludos

Etiquetas: rendimiento
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 21:12.