Jump to content

[BUG PS1.5.x] Import CSV déclinaisons et produits très très (très) long


Recommended Posts

Bonjour à Tous,

 

Lorsque je fais des imports de déclinaisons sur PS 1.5.4, ceux-ci mettent extrêmement longtemps pour terminer. Exemple avec le fichier en pj de 4672 lignes pour lequel l'import a duré environ 6h !!!

 

Avec cette durée, impossible de faire ça "online" car même sur un dédié, cela coupe au bout d'1H. Donc obligé de faire ça en local.

 

Savez-vous si c'est un bug, ou s'il y a un moyen pour accélérer tout ça car j'ai une 50aine de produits et si tous prennent ~6h, je ne suis pas près d'avoir terminé !!

 

Merci d'avance.

newPrima.zip

Edited by dangee (see edit history)
Link to comment
Share on other sites

bonjour à tous,

je laisse votre sujet en place puisque vous êtes deux à avoir le même souci mais merci de bien respecter les règles liées au rapport de bugs. C'est important pour que les développeurs ne se retrouvent pas inonder de sujets liés à des problèmes perso. de configuration ou de serveur... ce qui est très souvent le cas ici... malheureusement.

http://www.prestashop.com/forums/topic/24670-lire-ceci-avant-de-poster-dans-ce-forum/

 

merci ^_^

Link to comment
Share on other sites

Merci Julie,

 

C'est vrai que je n'ai pas été très explicite et donné beaucoup de détails, mais sachez que j'ai effectué énormément de test avant de poster ici.

J'ai d'ailleurs également poser la question sur le forum FR et le forum ENG il y a quelques temps, mais sans aucune réponse...Il faut dire que d'importer des milliers de déclinaisons par produits n'est pas très fréquents.

 

Si ça peut aider, voici la config php actuelle du serveur dédié sur lequel le site est installé (tirée du BO) :

 

Informations sur votre serveur: Linux #2 SMP Thu Aug 25 16:43:23 UTC 2011 x86_64

Version du logiciel serveur: Apache

Version de PHP: 5.3.21

Limite de mémoire: 300M

Temps d'exécution maximal (max_execution_time): 259200

 

En regardant un peu le traitement de l'import par PS, j'ai l'impression que la durée de celui-ci est exponentiel, car PS "revient" au début du fichier à chaque nouvel ligne...

 

En espérant que cela puisse aider

Link to comment
Share on other sites

Mettez votre version de php et les caractéristiques de votre hébergement, cela pourra peut-être intéresser un Dev de Prestashop si il y en a un qui passe par là.

 

Toujours est-il que le pb est plus que gênant, et je ne peux pas croire que nous ne sommes que 2 dans ce cas là.

Link to comment
Share on other sites

Bonjour,

 

Petite question...Je vois que le fichier que j'ai mis en PJ sur mon 1er post a été téléchargé 3X. Pourrait-on savoir si c'est 1 dev qui l'a téléchargé ou un contributeur, et qu'en est-il du résultat ? L'import a t-il fonctionné ? Si oui, en combien de temps ? Sur quel config ? etc...et Si non, l'info a t-elle été remontée à l'équipe de développement ?

 

Merci.

Link to comment
Share on other sites

;)

Ref = référence produit

PR à ignorer lors de l'import

 

Je viens de refaire un test avec un fichier beaucoup plus petit (400 lignes). Cela prend 5'40mn et je n'ai que 240 déclinaisons pris en compte dans la fiche du produit alors que les 400 sont bien présentes en BDD ?!?

Link to comment
Share on other sites

oui, c'est une mesure Kelvin donc k.

 

Pour le fichier SYLK, si je regarde le lien que vous avez mis, ce n'est pas grave et certainement dû à :

 

Ce problème se produit car vous ouvrez un fichier texte ou un fichier CSV dans lequel les deux premiers caractères sont les lettres majuscules « I » et « D ».

 

Et comme le fichier commence justement par ID Produit...

 

EDIT : Je travail avec Office 2013 sur PC

Edited by dangee (see edit history)
Link to comment
Share on other sites

Oui, pas grave... c'était pour info. C'est ID en capitale qui provoque le problème. ID en minuscule plus de problème le fichier s'ouvre correctement dans Excell ou OpenOffice ;)

 

Revenons à l'importation : 200 lignes environ 4 minutes.

- le module mail alert est-il actif ? envoie un email stock en dessous de 3

- la gestion des stocks est active ?

- cocher supprimer tous les déclinaisons avant l'import ?

 

Importation : 200 lignes moins d'1 minutes en désactivant la gestion de stock, en désactivant le module mail alert et en cochant supprimer tous les déclinaisons avant l'import ?

Link to comment
Share on other sites

• l'importation du fichier complet ne progresse plus après 600 lignes chez moi

Scinde le fichier (4 673 lignes) en 8 fichiers environ. A tester.

 

• Dans AdminImportController.php ces deux paramètres à voir ;)

 

@ini_set('max_execution_time', 0);
/** No max line limit since the lines can be more than 4096. Performance impact is not significant. */
define('MAX_LINE_SIZE', 0);

Link to comment
Share on other sites

- cocher supprimer tous les déclinaisons avant l'import ?

Mais dans ce cas, est-ce que cela ne supprime pas toutes les déclinaisons de tous les produits ??

 

Je vais essayer de désactiver les différents modules et voir ce que ça donne....et pour ce qui est du fichier AdminImportController.php, la modification des paramètres n'a aucun effet

Link to comment
Share on other sites

Mais dans ce cas, est-ce que cela ne supprime pas toutes les déclinaisons de tous les produits ??

Oui, bien sûr, mais cela permet de repartir à zéro.

Si toutes tes déclinaisons sont contenues dans ton fichier csv alors pas de problème <_<

 

protected function truncateTables($case)
{
	switch ((int)$case)
	{
	   case $this->entities[$this->l('Combinations')]:
			Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute`');
			Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute_impact');
			Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute_lang`');
			Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute_group`');
			Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute_group_lang`');
			Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute_group_shop`');
			Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute_shop`');
			Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attribute`');
			Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attribute_shop`');
			Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attribute_combination`');
			Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attribute_image`');
			Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'stock_available` WHERE id_product_attribute !=0');
			break;
	    }
  	 }

Edited by indesign (see edit history)
Link to comment
Share on other sites

Si toutes tes déclinaisons sont contenues dans ton fichier csv alors pas de problème <_<

Heu...impossible car alors j'aurai au moins 100 000 lignes...J'imagine même pas le temps qu'il faudrait :)

 

Sinon, la fonction c'est pour mettre où ??

Link to comment
Share on other sites

Je suis entrain de tester le gestionnaire de déclinaisons, même si ça ne correspond pas vraiment à ce dont j'ai besoin, et ça tourne depuis 3h30 !!...et en mettant le max_execution_time à 0 et le memory_limit à 3072M (en dessous prestashop n'a pas assez de mémoire alloué) !!

Link to comment
Share on other sites

Humm...ok....Mais ça m'arrange pas car j'ai besoin de la Ref car sur chaque produit il y a une demande de devis...Je vais essayer avec la méthode présente sur le post que vous avez mis en lien...à voir...Merci en tout cas :)

Link to comment
Share on other sites

mais c'est une belle progression non ?

C'est plus qu'une progression :) !! D'autant plus qu'avec le générateur de déclinaison le script n'a jamais terminé...Je me demande quand même en quoi le fait d'ajouter une ref pose autant de pb :blink: ...

Vous avez désactivé les différents modules pour votre test ou pas ??

Link to comment
Share on other sites

Je me demande quand même en quoi le fait d'ajouter une ref pose autant de pb :blink: ...

Selon le code AdminImportController

• si la référence existe il fait un update et "il se perd" dans la boucle

• si la référence n'existe pas il l'ajoute simplement : c'est plus rapide

 

                   	 // if a reference is specified for this product, get the associate id_product_attribute to UPDATE
                       if (isset($info['reference']) && !empty($info['reference']))
                       {
                           $id_product_attribute = Combination::getIdByReference($product->id, strval($info['reference']));

                           // updates the attribute
                           if ($id_product_attribute)
                           {
                               // gets all the combinations of this product
                               $attribute_combinations = $product->getAttributeCombinations($default_language);
                               foreach ($attribute_combinations as $attribute_combination)
                               {
                                   if ($id_product_attribute && in_array($id_product_attribute, $attribute_combination))
                                   {
                                       $product->updateAttribute(
                                           $id_product_attribute,
                                           (float)$info['wholesale_price'],
                                           (float)$info['price'],
                                           (float)$info['weight'],
                                           0,
                                           (float)$info['ecotax'],
                                           $id_image,
                                           strval($info['reference']),
                                           strval($info['ean13']),
                                           (int)$info['default_on'],
                                           0,
                                           strval($info['upc']),
                                           (int)$info['minimal_quantity'],
                                           0,
                                           null,
                                           $id_shop_list
                                       );

                                       $id_product_attribute_update = true;
                                   }
                               }
                           }
                       }

                       // if no attribute reference is specified, creates a new one
                       if (!$id_product_attribute)
                       {
                           $id_product_attribute = $product->addCombinationEntity(
                               (float)$info['wholesale_price'],
                               (float)$info['price'],
                               (float)$info['weight'],
                               0,
                               (float)$info['ecotax'],
                               (int)$info['quantity'],
                               $id_image,
                               strval($info['reference']),
                               0,
                               strval($info['ean13']),
                               (int)$info['default_on'],
                               0,
                               strval($info['upc']),
                               (int)$info['minimal_quantity'],
                               $id_shop_list
                           );
                       }

 

 

Vous avez désactivé les différents modules pour votre test ou pas ??

Juste le module mailalerts

Link to comment
Share on other sites

une idée : doublon de ref dans le fichier csv qui ferait tourner le script en boucle ? à vérifier

 

En fait, chaque attributs donne une partie de la réf et comme celle-ci est calculée sur mon tableur, il ne peut normalement pas y avoir de doublon.

 

Donc en fait, il faudrait modifier le fichier AdminImport pour que le script ne vérifie pas s'il y a déjà une ref en BDD pour faire l'UPDATE...ou peut être même supprimer tout simplement cette partie ?!

Link to comment
Share on other sites

ou peut être même supprimer tout simplement cette partie ?!

Pas aussi simple, j'ai déjà essayé la valeur de la ref est unique : 1 ;)

 

 

Plutôt de ceci qui pointe vers la classe Combination.php

 

$id_product_attribute = Combination::getIdByReference($product->id, strval($info['reference']));

 

	/**
 * For a given product_attribute reference, returns the corresponding id
 *
 * @param int $id_product
 * @param string $reference
 * @return int id
 */
public static function getIdByReference($id_product, $reference)
{
	if (empty($reference))
		return 0;

	$query = new DbQuery();
	$query->select('pa.id_product_attribute');
	$query->from('product_attribute', 'pa');
	$query->where('pa.reference LIKE \'%'.pSQL($reference).'%\'');
	$query->where('pa.id_product = '.(int)$id_product);

	return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query);
}

Edited by indesign (see edit history)
Link to comment
Share on other sites

en supprimant juste ceci

$attribute_combinations = $product->getAttributeCombinations($default_language);
							foreach ($attribute_combinations as $attribute_combination)
							{
							 }

 

Le fichier csv s'importe en 3 minutes avec les ref ;) ...

Par contre, il n'est pas complet.

 

 

 

Je te laisse maintenant. La solution n'est plus très loin normalement. B)

Link to comment
Share on other sites

Bon...en fait j'ai opté pour une solution radicale ! Refaire le site sous Prestashop 1.4.x car ce problème n'existe pas dans cette version.

 

Merci pour tout Indesign et j'espère vraiment que les DEV de Presta vont se pencher sur le sujet pour les prochaines versions.

 

Je ne mets pas le post en "résolu" car il ne l'est pas.

Link to comment
Share on other sites

Bonjour,

 

A priori le problème est le même pour l'import de produits. j'essaye d'importer un fichier de 1120 lignes et le script ne va pas au bout pour se terminer avec "page réinitialisée" au bout de 40-60mn...

Je précise que c'est sur un serveur différent que mon pb d'import de déclinaison.

 

J'espère vraiment que l'équipe de Presta se penche sur le sujet car pas facile de travailler dans ces conditions...

 

PS : Comment on modifie le titre du post ??

Link to comment
Share on other sites

Editer le premier post, click use full editor

Merci ! ;)

 

Pour ce qui est du fichier, oui, il y a les ref, mais aussi les images, les descriptions (longues + courtes), les meta,...la totale quoi ;)...Ce qui n'excuse pas le fait que vu que la fonctionnalité est implémentée, elle doit fonctionner, sinon, autant ne pas la mettre...Surtout que ça marche nickel sous PS1.4.x

Link to comment
Share on other sites

  • 2 years later...

Bonjour à tous,

 

J'utilise également la référence dans l'import de mes CSV produit et j'ai trouvé un moyen d’accélérer énormément l'import avec utilisation de la référence (option "Utiliser la référence du produit comme clé" cochée).

 

Il suffit d'ajouter un index mysql à la colonne référence dans la table ps_product. Et oui, cet index n'est pas présent par défaut et comme l'import vérifie en permanence la présence des références, plus la table est volumineuse, plus c'est sera long.

 

Voila la commande sql à lancer : ALTER TABLE `ps_product`ADD UNIQUE INDEX `product_reference` (`reference`);

 

Jean-François Viguier

Creabilis

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...