Migration PrestaShop 1.6 vers 9 : Guide Complet (2026)

Docker PHP Production
Migration PrestaShop 1.6 vers 9 : Guide Complet (2026)

Migration PrestaShop 1.6 → 9 — Le Guide Complet et Humanisé

Comment migrer une vraie boutique de 1387 produits, 1167 commandes et 838 clients depuis PrestaShop 1.6.1.13 vers PrestaShop 9.1.3 — sans rien perdre.

Ce que vous allez apprendre Ce guide documente une migration réelle, effectuée en mai 2026, d'une boutique PrestaShop 1.6.1.13 active vers PrestaShop 9.1.3. Chaque erreur rencontrée est documentée avec sa cause et sa correction. Aucun embellissement : c'est ce qui s'est réellement passé.

Migrer une boutique PrestaShop de la version 1.6 vers la version 9 n'est pas une opération banale. Il s'agit de traverser 10 ans d'évolutions techniques : changement de moteur de template (Smarty → Twig), adoption de Symfony comme framework, montée de PHP 5.6 à 8.2, refonte complète du backoffice, et bien d'autres ruptures.

PrestaShop n'autorise pas un saut direct de 1.6 à 9. La migration doit être incrémentale, en passant obligatoirement par les versions intermédiaires majeures. Ce guide vous montre exactement comment faire, avec Docker pour isoler chaque phase.

1. Prérequis et architecture

Avant de commencer, voici ce dont vous avez besoin :

  • Docker Desktop (Windows, Mac ou Linux) — version 4.x minimum
  • Un dump SQL de votre base PrestaShop 1.6
  • Les fichiers de votre boutique PrestaShop 1.6 (ou a minima les images produits)
  • ~20 Go d'espace disque libre
  • Du temps : comptez 4 à 8 heures selon la taille de votre boutique
Faites une sauvegarde avant tout ! Cette opération ne modifie pas votre boutique en production. Tout se passe dans des containers Docker isolés. Mais conservez précieusement votre dump SQL original — c'est votre filet de sécurité.

Structure du projet

Structure des dossiers
migration/
├── docker-compose.phase1.yml   # PS 1.6 → 1.7  (PHP 7.4 + MySQL 5.7)
├── docker-compose.phase2.yml   # PS 1.7 → 8.x  (PHP 8.1 + MySQL 8.0)
├── docker-compose.phase3.yml   # PS 8.x → 9.x  (PHP 8.2 + MySQL 8.0)
├── php/
│   ├── 7.4/Dockerfile
│   ├── 8.1/Dockerfile
│   └── 8.2/Dockerfile
└── prestashop/                 # Fichiers PS (bind mount)

2. Stratégie de migration

Pourquoi une migration incrémentale ?

PrestaShop utilise un module appelé autoupgrade qui compare deux versions et applique les différences (fichiers + SQL). Ce module ne supporte que les sauts de version d'une version majeure à la suivante. Il est impossible de passer directement de 1.6 à 9.

Point de départ
1.6.1.13
PHP 5.6–7.1
⬇️
Phase 1
1.7.8.11
PHP 7.4
Phase 2
8.1.7
PHP 8.1
Phase 3
9.1.3
PHP 8.2

Pourquoi Docker ?

Chaque version de PrestaShop nécessite une version précise de PHP et MySQL. Docker permet de changer d'environnement instantanément, sans toucher à votre système hôte et sans risquer de conflits entre les versions. C'est la méthode la plus propre et la plus reproductible.

3. Phase 1 — PrestaShop 1.6 → 1.7.8.11

La première phase consiste à monter PrestaShop 1.6 dans un container Docker avec PHP 7.4, puis à utiliser le module autoupgrade pour atteindre la version 1.7.8.11 (la dernière stable de la branche 1.7).

3.1 Environnement Docker — PHP 7.4 + MySQL 5.7

migration/php/7.4/Dockerfile
FROM php:7.4-apache

RUN apt-get update && apt-get install -y \
    libzip-dev libpng-dev libjpeg-dev libfreetype6-dev \
    libicu-dev libxml2-dev unzip curl git \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install \
        pdo_mysql mysqli zip gd intl xml soap bcmath opcache

# Activer mod_rewrite
RUN a2enmod rewrite

# Configuration Apache pour PrestaShop
RUN echo "<Directory /var/www/html>\n\
    Options Indexes FollowSymLinks\n\
    AllowOverride All\n\
    Require all granted\n\
</Directory>" > /etc/apache2/conf-available/prestashop.conf \
    && a2enconf prestashop

# PHP settings recommandés PrestaShop
RUN echo "memory_limit = 512M\n\
upload_max_filesize = 64M\n\
post_max_size = 64M\n\
max_execution_time = 600\n\
date.timezone = Europe/Paris" > /usr/local/etc/php/conf.d/prestashop.ini

WORKDIR /var/www/html
migration/docker-compose.phase1.yml
services:
  db:
    image: mysql:5.7
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
      - --max-allowed-packet=128M
    environment:
      MYSQL_ROOT_PASSWORD: migration_root
      MYSQL_DATABASE: prestashop
      MYSQL_USER: ps_user
      MYSQL_PASSWORD: ps_pass
    volumes:
      - mysql_data:/var/lib/mysql
    ports:
      - "3307:3306"

  web:
    build:
      context: .
      dockerfile: php/7.4/Dockerfile
    volumes:
      - ./prestashop:/var/www/html
    ports:
      - "8080:80"
    depends_on:
      - db

volumes:
  mysql_data:

3.2 Import du dump SQL

  1. Démarrer les containers
    cd migration
    docker compose -f docker-compose.phase1.yml up -d
  2. Attendre que MySQL soit prêt
    docker exec migration-db-1 mysqladmin -u root -pmigration_root ping --wait=30
  3. Importer le dump SQL PrestaShop 1.6
    docker exec -i migration-db-1 mysql -u ps_user -pps_pass prestashop \
      < /chemin/vers/votre/dump.sql
  4. Vérifier l'import
    docker exec migration-db-1 mysql -u ps_user -pps_pass prestashop \
      -e "SELECT COUNT(*) FROM psc_product; SELECT COUNT(*) FROM psc_orders;"
  5. Mettre à jour les paramètres de connexion DB dans PrestaShop
    # Éditer app/config/parameters.php (PS 1.7) ou config/settings.inc.php (PS 1.6)
    docker exec migration-web-1 bash -c "
      sed -i 's/database_host.*/database_host: db/' /var/www/html/app/config/parameters.php
      sed -i 's/database_user.*/database_user: ps_user/' /var/www/html/app/config/parameters.php
      sed -i 's/database_password.*/database_password: ps_pass/' /var/www/html/app/config/parameters.php
      sed -i 's/database_name.*/database_name: prestashop/' /var/www/html/app/config/parameters.php
    "

3.3 Upgrade vers 1.7.8.11 via autoupgrade CLI

Téléchargez PrestaShop 1.7.8.11 et le module autoupgrade, puis placez les fichiers zip dans le dossier admin.

# Télécharger autoupgrade v7.x
docker exec migration-web-1 bash -c "
  cd /var/www/html/modules && \
  curl -L https://github.com/PrestaShop/autoupgrade/releases/download/v7.6.5/autoupgrade.zip \
    -o autoupgrade.zip && unzip autoupgrade.zip && rm autoupgrade.zip
"

# Placer le zip PS 1.7.8.11 dans le dossier autoupgrade
docker exec migration-web-1 bash -c "
  mkdir -p /var/www/html/admin877cxpytd/autoupgrade/download
  # Copiez prestashop_1.7.8.11.zip et prestashop_1.7.8.11.xml ici
"

# Lancer l'upgrade en mode CLI
docker exec migration-web-1 bash -c "
  cd /var/www/html && php modules/autoupgrade/bin/console update:start \
    admin877cxpytd \
    --channel=local \
    --zip=prestashop_1.7.8.11.zip \
    --xml=prestashop_1.7.8.11.xml \
    --chain \
    --disable-all-overrides=1 \
    2>&1
"
L'option --chain Cette option enchaîne automatiquement toutes les étapes (UpdateFiles → UpdateDatabase → UpdateModules → CleanDatabase → UpdateComplete) sans intervention manuelle. En cas d'erreur, chaque étape peut être relancée avec --action=NomEtape.

Vérification après phase 1

docker exec migration-db-1 mysql -u ps_user -pps_pass prestashop \
  -e "SELECT value FROM psc_configuration WHERE name='PS_VERSION_DB';"
# Résultat attendu : 1.7.8.11

4. Phase 2 — PrestaShop 1.7.8.11 → 8.1.7

C'est la phase la plus délicate. La migration de PS 1.7 vers PS 8 implique un changement majeur de PHP (7.4 → 8.1), une refonte du backoffice Symfony, et la suppression de nombreuses fonctionnalités dépréciées.

4.1 Environnement Docker — PHP 8.1 + MySQL 8.0

migration/php/8.1/Dockerfile
FROM php:8.1-apache

RUN apt-get update && apt-get install -y \
    libzip-dev libpng-dev libjpeg-dev libfreetype6-dev \
    libicu-dev libxml2-dev unzip curl git \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install \
        pdo_mysql mysqli zip gd intl xml soap bcmath opcache

RUN a2enmod rewrite

RUN echo "<Directory /var/www/html>\n\
    Options Indexes FollowSymLinks\n\
    AllowOverride All\n\
    Require all granted\n\
</Directory>" > /etc/apache2/conf-available/prestashop.conf \
    && a2enconf prestashop

RUN echo "memory_limit = 512M\n\
upload_max_filesize = 64M\n\
post_max_size = 64M\n\
max_execution_time = 600\n\
date.timezone = Europe/Paris" > /usr/local/etc/php/conf.d/prestashop.ini

WORKDIR /var/www/html

Arrêtez le container phase 1, reconstruisez avec PHP 8.1 :

docker compose -f docker-compose.phase1.yml down
docker compose -f docker-compose.phase2.yml up -d --build

4.2 Erreurs rencontrées — Phase 2

❌ Erreur 1 — Unable to generate diff file list between 1.7.8.11 and 8.1.7

Cause : La fonction ChecksumCompare::getFilesDiffBetweenVersions() retourne false sur certains environnements WSL2/bind-mount Windows. L'autoupgrade ne peut pas générer la liste des fichiers à supprimer.

✅ Correction

Patcher modules/autoupgrade/classes/Task/Update/UpdateFiles.php pour continuer avec un diff vide au lieu d'échouer :

// Trouver ce bloc (vers la ligne 265) :
if (!is_array($diffFileList)) {
    $this->logger->error(...);
    $this->next = TaskName::TASK_ERROR;
    $this->setErrorFlag();
    return ExitCode::FAIL;
}

// Remplacer par :
if (!is_array($diffFileList)) {
    $this->logger->warning("Diff unavailable, proceeding without deleting old files.");
    $diffFileList = ["modified" => [], "deleted" => []];
}
if (false) { // bloc mort, jamais exécuté
    $this->logger->error(...);
    $this->next = TaskName::TASK_ERROR;
    $this->setErrorFlag();
    return ExitCode::FAIL;
}
❌ Erreur 2 — rmdir: Directory not empty (WSL2 bind mount)

Cause : Sur Windows avec Docker Desktop (WSL2), la fonction Symfony Filesystem::remove() échoue sur les répertoires var/cache/prod/ContainerXXX/ qui contiennent des fichiers verrouillés.

✅ Correction

Patcher modules/autoupgrade/classes/UpgradeTools/CacheCleaner.php pour utiliser rm -rf shell au lieu de Symfony :

// Dans la méthode cleanFolders(), dans la boucle foreach($this->getFolderList() as $dir) :
// Remplacer :
$filesystem->clearDirectory($dir);

// Par :
exec("rm -rf " . escapeshellarg($dir));
@mkdir($dir, 0777, true);
❌ Erreur 3 — Unknown column 'h.live_edit' lors du cache warmup

Cause : Les fichiers override/ de PS 1.6 contiennent des requêtes SQL qui référencent la colonne live_edit, supprimée dans PS 8.x. Cela provoque un fatal lors du boot du kernel Symfony.

✅ Correction

Désactiver tous les fichiers override en les renommant :

docker exec migration-web-1 bash -c "
  find /var/www/html/override -name '*.php' \
    -exec mv {} {}.bak \;
  echo 'Tous les overrides désactivés'
"
❌ Erreur 4 — appParameters.php missing / cache prod vide

Cause : Le script rm -rf var/cache/* supprime le répertoire prod/. Le fichier config/bootstrap.php échoue silencieusement à le recréer, causant une erreur au démarrage.

✅ Correction
docker exec migration-web-1 bash -c "
  rm -rf /var/www/html/var/cache/*
  mkdir -p /var/www/html/var/cache/prod
  cd /var/www/html && php bin/console cache:clear --env=prod
"

Commande complète pour la phase 2

docker exec migration-web-1 bash -c "
  rm -rf /var/www/html/var/cache/* && \
  mkdir -p /var/www/html/var/cache/prod && \
  cd /var/www/html && \
  php modules/autoupgrade/bin/console update:start admin877cxpytd \
    --channel=local \
    --zip=prestashop_8.1.7.zip \
    --xml=prestashop_8.1.7.xml \
    --chain \
    --disable-all-overrides=1 \
    2>&1 | tee /tmp/upgrade-phase2.log
"

5. Phase 3 — PrestaShop 8.1.7 → 9.1.3

La migration vers PS 9 est la plus complexe. Elle implique PHP 8.2, Symfony 6, et une restructuration importante du code source (nouveaux namespaces, suppressions de classes, changements d'interfaces).

5.1 Environnement Docker — PHP 8.2 + MySQL 8.0

migration/php/8.2/Dockerfile
FROM php:8.2-apache

RUN apt-get update && apt-get install -y \
    libzip-dev libpng-dev libjpeg-dev libfreetype6-dev \
    libicu-dev libxml2-dev unzip curl git \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install \
        pdo_mysql mysqli zip gd intl xml soap bcmath opcache

RUN a2enmod rewrite

RUN echo "<Directory /var/www/html>\n\
    Options Indexes FollowSymLinks\n\
    AllowOverride All\n\
    Require all granted\n\
</Directory>" > /etc/apache2/conf-available/prestashop.conf \
    && a2enconf prestashop

RUN echo "memory_limit = 512M\n\
upload_max_filesize = 64M\n\
post_max_size = 64M\n\
max_execution_time = 600\n\
date.timezone = Europe/Paris" > /usr/local/etc/php/conf.d/prestashop.ini

WORKDIR /var/www/html
docker compose -f docker-compose.phase2.yml down
docker compose -f docker-compose.phase3.yml up -d --build

5.2 Erreurs rencontrées — Phase 3 (les plus nombreuses !)

❌ Erreur 5 — ModuleTemplateIterator::getIterator() incompatible avec PHP 8.2

Cause : PHP 8.2 impose la déclaration stricte du type de retour : \Traversable sur les méthodes héritées. La classe ModuleTemplateIterator surcharge getIterator() sans ce type de retour.

✅ Correction

Ajouter le type de retour avec le namespace global (attention au \ obligatoire) :

docker exec migration-web-1 php -r "
\$f = '/var/www/html/src/PrestaShopBundle/Twig/Locator/ModuleTemplateIterator.php';
\$c = file_get_contents(\$f);
\$c = str_replace(
    'public function getIterator()',
    'public function getIterator(): \\\\Traversable',
    \$c
);
file_put_contents(\$f, \$c);
echo 'Patched';
"
Attention au backslash ! Il faut impérativement écrire : \Traversable (avec le \ global), pas : Traversable. Sans le backslash, PHP cherche PrestaShopBundle\Twig\Locator\Traversable et échoue.
❌ Erreur 6 — Cannot autowire: Symfony\Component\Translation\TranslatorInterface not found

Cause : Dans Symfony 5+, Symfony\Component\Translation\TranslatorInterface a été déplacé vers Symfony\Contracts\Translation\TranslatorInterface. Dix-huit fichiers PS 8.x utilisaient encore l'ancien namespace.

✅ Correction — 18 fichiers en une commande
docker exec migration-web-1 php -r "
\$files = explode(\"\n\", trim(shell_exec(
    'grep -rl \"Component.Translation.TranslatorInterface\" /var/www/html/src/'
)));
foreach (array_filter(\$files) as \$f) {
    \$c = file_get_contents(\$f);
    \$c = str_replace(
        'use Symfony\Component\Translation\TranslatorInterface;',
        'use Symfony\Contracts\Translation\TranslatorInterface;',
        \$c
    );
    file_put_contents(\$f, \$c);
}
echo count(\$files) . ' fichiers corrigés';
"
❌ Erreur 7 — 177 fichiers PHP fantômes (PS 8.x non supprimés)

Cause : L'étape UpdateFiles de l'autoupgrade n'a pas supprimé tous les anciens fichiers PS 8.x. Ces fichiers "fantômes" déclenchent des erreurs de compilation du container Symfony (classes introuvables, interfaces ambiguës…).

✅ Correction — Suppression par comparaison avec le ZIP officiel
# 1. Extraire le ZIP PS 9 dans /tmp
docker exec migration-web-1 bash -c "
  unzip -p /var/www/html/admin877cxpytd/autoupgrade/download/prestashop_9.1.3.zip \
    prestashop.zip > /tmp/ps913.zip
"

# 2. Lister les fichiers PHP du ZIP officiel PS 9.1.3
docker exec migration-web-1 bash -c "
  unzip -l /tmp/ps913.zip | grep '\.php$' | awk '{print \$4}' \
    | grep '^src/' | sort > /tmp/ps913_src_files.txt
"

# 3. Lister les fichiers PHP sur le disque
docker exec migration-web-1 bash -c "
  find /var/www/html/src -name '*.php' \
    | sed 's|/var/www/html/||' | sort > /tmp/disk_src_files.txt
"

# 4. Identifier les fichiers fantômes
docker exec migration-web-1 bash -c "
  comm -23 /tmp/disk_src_files.txt /tmp/ps913_src_files.txt \
    > /tmp/phantom_files.txt
  echo \"\$(wc -l < /tmp/phantom_files.txt) fichiers fantômes trouvés\"
"

# 5. Les supprimer
docker exec migration-web-1 bash -c "
  while IFS= read -r file; do
    rm -f \"/var/www/html/\$file\"
  done < /tmp/phantom_files.txt
  echo 'Suppression terminée'
"

Faire la même chose pour les fichiers YAML de configuration :

docker exec migration-web-1 bash -c "
  # Fichiers YAML fantômes identifiés manuellement
  rm -f /var/www/html/src/PrestaShopBundle/Resources/config/services/adapter/twig.yml
  rm -f /var/www/html/src/PrestaShopBundle/Resources/config/services/adapter/customer_message.yml
  rm -f /var/www/html/src/PrestaShopBundle/Resources/config/services/adapter/customer_service.yml
  rm -f /var/www/html/src/PrestaShopBundle/Resources/config/services/core/domain/cart.yml
  rm -f /var/www/html/src/PrestaShopBundle/Resources/config/services/core/util/file_size.yml
  rm -f /var/www/html/src/PrestaShopBundle/Resources/config/services/core/util/number.yml
  rm -f /var/www/html/src/PrestaShopBundle/Resources/config/services/core/util/string.yml
  echo '7 fichiers YAML fantômes supprimés'
"
❌ Erreur 8 — Ancien dossier admin836bzp0rp détecté à la place de admin877cxpytd

Cause : Un ancien dossier admin (issu d'une phase de migration précédente) existait encore à la racine. Le kernel Symfony scanne les dossiers par ordre alphabétique et prenait admin836bzp0rp en premier, compilant le container avec le mauvais chemin admin.

✅ Correction
# Vérifier quels dossiers admin existent
docker exec migration-web-1 bash -c "ls /var/www/html/ | grep admin"
# Si vous voyez plusieurs dossiers admin (ex: admin836bzp0rp et admin877cxpytd),
# supprimez les anciens :
docker exec migration-web-1 bash -c "rm -rf /var/www/html/admin836bzp0rp"
❌ Erreur 9 — Duplicate entry pour psc_module (préfixes UA_ accumulés)

Cause : Chaque relance de l'autoupgrade ajoute le préfixe UA_ aux noms des modules en quarantaine. Après plusieurs relances, un module peut avoir un nom comme UA_UA_UA_UA_UA_UA_UA_UA_UA_UA_bankwire. Lors de la suppression de la quarantaine, l'UPDATE tente de créer un doublon si la version propre existe déjà.

✅ Correction SQL
# 1. Supprimer les doublons (UA_ + version propre qui coexistent)
docker exec migration-db-1 mysql -u ps_user -pps_pass prestashop -e "
  DELETE m1 FROM psc_module m1
  INNER JOIN psc_module m2
    ON REPLACE(m1.name, 'UA_', '') = m2.name
  WHERE m1.name LIKE 'UA_%' AND m1.name != m2.name;
"

# 2. Nettoyer tous les préfixes UA_ restants
docker exec migration-db-1 mysql -u ps_user -pps_pass prestashop -e "
  UPDATE psc_module
  SET name = REPLACE(name, 'UA_', '')
  WHERE name LIKE 'UA_%';
"

# 3. Vérifier
docker exec migration-db-1 mysql -u ps_user -pps_pass prestashop -e "
  SELECT COUNT(*) as ua_restants FROM psc_module WHERE name LIKE 'UA_%';
"
❌ Erreur 10 — progressPercentage bloqué (InvalidArgumentException)

Cause : Le fichier d'état de l'autoupgrade (state_update.var) mémorise le pourcentage d'avancement. Si on relance l'étape UpdateDatabase (qui commence à 60%), mais que l'état indique déjà 89%, l'autoupgrade refuse de régresser.

✅ Correction — Reset de l'état
docker exec migration-web-1 php -r "
\$state = [
    'currentVersion'      => '8.1.7',
    'destinationVersion'  => '9.1.3',
    'skipUninstallModule' => false,
    'installedLanguagesIso' => ['fr'],
    'warningDetected'     => true,
    'progressPercentage'  => 0,   // ← reset ici
];
file_put_contents(
    '/var/www/html/admin877cxpytd/autoupgrade/state_update.var',
    base64_encode(serialize(\$state))
);
echo 'État réinitialisé';
"
❌ Erreur 11 — Permission denied sur var/cache/ (HTTP 500)

Cause : Les commandes cache:clear lancées en root créent des fichiers appartenant à root. Apache tourne en www-data et ne peut pas écrire dans ces répertoires.

✅ Correction
docker exec migration-web-1 bash -c "
  chown -R www-data:www-data /var/www/html/var/cache/
  chown -R www-data:www-data /var/www/html/var/logs/
"

Commande complète pour la phase 3

# Télécharger PS 9.1.3 (adapter l'URL selon la version disponible)
docker exec migration-web-1 bash -c "
  mkdir -p /var/www/html/admin877cxpytd/autoupgrade/download
  # Placer prestashop_9.1.3.zip et prestashop_9.1.3.xml dans ce dossier
"

# Appliquer les patches (erreurs 5, 6, 7, 8 ci-dessus) puis lancer :
docker exec migration-web-1 bash -c "
  rm -rf /var/www/html/var/cache/* && \
  mkdir -p /var/www/html/var/cache/prod && \
  cd /var/www/html && \
  php modules/autoupgrade/bin/console update:start admin877cxpytd \
    --channel=local \
    --zip=prestashop_9.1.3.zip \
    --xml=prestashop_9.1.3.xml \
    --chain \
    --disable-all-overrides=1 \
    2>&1 | tee /tmp/upgrade-phase3.log
"

# Si UpdateDatabase échoue et que les modules UA_ sont en doublon :
# → appliquer l'erreur 9 puis relancer avec --action=UpdateModules

docker exec migration-web-1 bash -c "
  cd /var/www/html && \
  php modules/autoupgrade/bin/console update:start admin877cxpytd \
    --channel=local \
    --zip=prestashop_9.1.3.zip \
    --xml=prestashop_9.1.3.xml \
    --chain \
    --disable-all-overrides=1 \
    --action=UpdateModules
"

6. Vérification finale

6.1 Vérifier l'intégrité des données

docker exec migration-db-1 mysql -u ps_user -pps_pass prestashop -e "
SELECT 'Version PS'  as check_name, value as result
  FROM psc_configuration WHERE name='PS_VERSION_DB'
UNION
SELECT 'Produits',    COUNT(*) FROM psc_product
UNION
SELECT 'Commandes',   COUNT(*) FROM psc_orders
UNION
SELECT 'Clients',     COUNT(*) FROM psc_customer WHERE deleted=0
UNION
SELECT 'Catégories',  COUNT(*) FROM psc_category
UNION
SELECT 'Images',      COUNT(*) FROM psc_image;"
Résultats obtenus sur notre boutique Version PS : 9.1.3 — Produits : 1387 — Commandes : 1167 — Clients : 838. Toutes les données sont intactes.

6.2 Corriger les permissions et régénérer le cache

docker exec migration-web-1 bash -c "
  # Clear complet
  rm -rf /var/www/html/var/cache/*
  mkdir -p /var/www/html/var/cache/prod

  # Regenerer le cache en tant que www-data
  su www-data -s /bin/bash -c '
    cd /var/www/html && php bin/console cache:warmup --env=prod
  '

  # Corriger les permissions
  chown -R www-data:www-data /var/www/html/var/
"

6.3 Accéder au backoffice

Ouvrez votre navigateur sur http://localhost:8080/admin877cxpytd/

Vous devriez voir la nouvelle page de connexion PrestaShop 9. Connectez-vous avec vos identifiants habituels.

Après la migration : étapes importantes
  • Réactiver et mettre à jour les modules compatibles PS 9
  • Réécrire les overrides (classes personnalisées) pour PS 9
  • Vérifier les templates du thème
  • Tester le tunnel de commande complet
  • Régénérer les images (si redimensionnement nécessaire)

7. Récapitulatif de toutes les erreurs

# Erreur Phase Cause Statut
1 Unable to generate diff file list 1.7→8.x WSL2 bind mount + API Distribution Corrigé
2 rmdir: Directory not empty 1.7→8.x Symfony Filesystem vs WSL2 Corrigé
3 Unknown column 'h.live_edit' 1.7→8.x Override PS 1.6 incompatible PS 8 Corrigé
4 appParameters.php manquant 1.7→8.x Répertoire prod/ absent après rm -rf Corrigé
5 getIterator() return type PHP 8.2 8.x→9.x Strict typing PHP 8.2 Corrigé
6 TranslatorInterface namespace 8.x→9.x Symfony Component → Contracts Corrigé
7 177 fichiers PHP fantômes 8.x→9.x UpdateFiles incomplet (WSL2) Corrigé
8 Mauvais dossier admin détecté 8.x→9.x Deux dossiers admin coexistants Corrigé
9 Duplicate entry psc_module UA_ 8.x→9.x Préfixes UA_ accumulés sur relances Corrigé
10 progressPercentage bloqué 8.x→9.x State autoupgrade non réinitialisé Corrigé
11 Permission denied var/cache 8.x→9.x Cache créé en root, Apache = www-data Corrigé

8. Conclusion

Migrer PrestaShop 1.6 vers PrestaShop 9 est faisable, même avec une boutique de plusieurs centaines de produits et de milliers de commandes. La clé est la méthode : des upgrades incrémentaux, un environnement Docker isolé pour chaque phase, et une documentation systématique des erreurs.

Les difficultés principales viennent de deux sources :

  • Les spécificités de l'environnement Windows/WSL2 qui perturbent les opérations fichiers de l'autoupgrade
  • Les ruptures de compatibilité PHP 8.2 (typing strict, namespaces Symfony renommés, classes restructurées)

Le module autoupgrade CLI est votre meilleur ami pour cette opération : il permet de contrôler chaque étape, de relancer une phase spécifique avec --action=, et de tout tracer dans des fichiers de log.

Résultat final PS 9.1.3 opérationnel, 1387 produits, 1167 commandes, 838 clients — tout intact. La migration a pris environ 6 heures en incluant le débogage de toutes les erreurs documentées dans ce guide.

Ressources utiles

Guide rédigé à partir d'une migration réelle effectuée en mai 2026.
Testé sur PrestaShop 1.6.1.13 → 1.7.8.11 → 8.1.7 → 9.1.3 avec Docker Desktop sur Windows 11.

Retour aux articles Développement