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.
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
Structure du projet
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.
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
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
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
-
Démarrer les containers
cd migration docker compose -f docker-compose.phase1.yml up -d -
Attendre que MySQL soit prêt
docker exec migration-db-1 mysqladmin -u root -pmigration_root ping --wait=30 -
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 -
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;" -
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
"
--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
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
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.
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;
}
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.
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);
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.
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'
"
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.
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
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 !)
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.
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';
"
: \Traversable (avec le \ global), pas : Traversable. Sans le backslash, PHP cherche PrestaShopBundle\Twig\Locator\Traversable et échoue.
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.
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';
"
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…).
# 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'
"
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.
# 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"
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à.
# 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_%';
"
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.
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é';
"
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.
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;"
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.
- 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.
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.