Comment améliorer les performances d’importation dans Prestashop ?

Je me suis pris la tête dernièrement sur le module interne d’importation de produit de Prestashop (version > 1.5). Vous trouverez l’histoire sur le forum d’OVH.

Le problème

L’importation d’environ 1400 produits (sans photo) prenait plus d’une heure à se faire. Oui oui, c’est extrêmement long. Je ne vous parle même pas du temps de l’importation des déclinaisons …

La solution


Après avoir cherché du coté de MySQL, voir PHP, il s’est avéré que cela provenait de Memcache que j’avais activé « pour voir ». Après la désactivation de Memcache, je suis passé à une importation en 8 minutes !! Youhouu. Mais c’est encore long …

Améliorer encore le temps d’importation

En réglant un paramètre dans la configuration de MySQL (innodb_flush_log_at_trx_commit) avec la valeur 0, je suis passé à 12 secondes pour l’importation. Le problème, c’est que laissé ainsi, il y a un risque de perte de données sur une coupure brusque du serveur. À la valeur 0, les données ne sont pas écrites sur le disque en temps réel mais toutes les secondes à peu prêt. Et ce, sur toutes les bases de données …

Je laisse donc la valeur par défaut (1) pour sécuriser l’enregistrement des données.

Il ne reste plus qu’une solution, c’est modifier le code d’importation de Prestashop. Pour laisser le code propre, nous allons simplement étendre le contrôleur concerné.

Dans le dossier override/controllers/admin (créer le si inexistant), créer un fichier appelé : AdminImportController.php

Dans ce fichier, coller le code si dessous:

<?php

class AdminImportController extends AdminImportControllerCore
{
    public function postProcess()
    {
        if (_PS_MODE_DEMO_ || !Tools::getValue('import') || !Tools::getValue('csv'))
        {
            parent::postProcess();
            return;
        }
        $db = Db::getInstance();
        $db->query("SET AUTOCOMMIT = 0");
        $db->query("START TRANSACTION");
        parent::postProcess();
        $db->query("COMMIT");
    }
}

Supprimer le fichier cache/class_index.php afin de prendre en compte votre code.

Le code consiste à encapsuler le code d’importation (parent::postProcess()) dans une transaction SQL.

La transaction va provoquer l’enregistrement des modifications de la base de données en mémoire et ne seront réellement enregistrées que quand la requête COMMIT sera effectuée.

Avec cette modification, l’importation de mes produits passe à 12 secondes et les déclinaisons en un peu moins de 1 minute.

4 réflexions sur « Comment améliorer les performances d’importation dans Prestashop ? »

  1. Bonjour, je sais que ce n’est pas le sujet mais je rencontre des difficultés pour l’import de mes déclinaisons : seules les images s’importent mais pas les attributs et valeurs … Avez vous un fichier type qui pourrait m’aider ?

    Merci bcp

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Notifiez-moi des commentaires à venir via email. Vous pouvez aussi vous abonner sans commenter.