PrestaShop 1.7.8.8升级至8.1.7:upgradeDB步骤报错如何解决?
PrestaShop 1.7.8.8 升级到8.1.7 CLI升级DB时SQL引擎选择失败
问题现象
通过CLI执行PrestaShop自动升级,文件升级完成后执行upgradeDb步骤时抛出Cannot select any valid SQL engine异常,尽管已确认PHP7.4环境中pdo_mysql和mysqli扩展均已安装。
升级报错日志
INFO - 506 files left to upgrade. INFO - === Step upgradeFiles INFO - 106 files left to upgrade. INFO - === Step upgradeFiles INFO - All files upgraded. Now upgrading database... INFO - Restart requested. Please run the following command to continue your upgrade: INFO - $ modules/autoupgrade/cli-upgrade.php --dir=admin9254z9q7u --action=upgradeDb --data=eyJlcnJvciI6bnVsbCwic3RlcERvbmUiOmZhbHNlLCJuZXh0IjoidXBncmFkZUZpbGVzIiwic3RhdHVzIjoib2siLCJuZXh0X2Rlc2MiOiJJTkZPIC0gUmVzdGFydCByZXF1ZXN0ZWQuIFBsZWFzZSBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kIHRvIGNvbnRpbnVlIHlvdXIgdXBncmFkZTpcbiIsIm5leHRRdWlja0luZm8iOltdLCJuZXh0RXJyb3JzIjpbXSwibmV4dFBhcmFtcyI6eyJvcmlnaW5WZXJzaW9uIjoiMS43LjguOCIsIml [..] INFO - === Step upgradeDb INFO - Cleaning file cache INFO - Running opcache_reset PrestaShopException in /var/www/presta_us_klon/classes/db/Db.php line 303 #0 /var/www/presta_us_klon/classes/db/Db.php(236): DbCore::getClass() #1 /var/www/presta_us_klon/config/alias.php(47): DbCore::getInstance() #2 /var/www/presta_us_klon/classes/shop/Shop.php(1351): pSQL() #3 /var/www/presta_us_klon/classes/shop/Shop.php(351): ShopCore::findShopByHost() #4 /var/www/presta_us_klon/config/config.inc.php(117): ShopCore::initialize() #5 /var/www/presta_us_klon/modules/autoupgrade/classes/UpgradeContainer.php(665): require_once('...') #6 /var/www/presta_us_klon/modules/autoupgrade/classes/Task/AbstractTask.php(165): PrestaShop\Module\AutoUpgrade\UpgradeContainer->initPrestaShopCore() #7 /var/www/presta_us_klon/modules/autoupgrade/classes/Task/Upgrade/UpgradeDb.php(90): PrestaShop\Module\AutoUpgrade\Task\AbstractTask->init() #8 /var/www/presta_us_klon/modules/autoupgrade/classes/Task/Runner/ChainedTasks.php(59): PrestaShop\Module\AutoUpgrade\Task\Upgrade\UpgradeDb->init() #9 /var/www/presta_us_klon/modules/autoupgrade/cli-upgrade.php(50): PrestaShop\Module\AutoUpgrade\Task\Runner\ChainedTasks->run() #10 {main}
异常触发代码
报错来自Db.php的getClass方法,当无法匹配到可用SQL引擎时抛出异常:
public static function getClass() { $class = ''; if (PHP_VERSION_ID >= 50200 && extension_loaded('pdo_mysql')) { $class = 'DbPDO'; } elseif (extension_loaded('mysqli')) { $class = 'DbMySQLi'; } if (empty($class)) { throw new PrestaShopException('Cannot select any valid SQL engine.'); } return $class; }
环境验证结果
已通过以下命令确认PHP7.4环境中pdo_mysql和mysqli扩展正常加载:
root@joffrey:/var/www# php7.4 -m | grep pdo_mysql pdo_mysql root@joffrey:/var/www# php7.4 -m | grep mysqli mysqli root@joffrey:/var/www/presta_us_klon# cat testy.php <?php print_r(get_loaded_extensions()); ?> root@joffrey:/var/www/presta_us_klon# php7.4 testy.php | grep -i 'mysqli\|pdo_mysql' [33] => mysqli [34] => pdo_mysql
解决方案
1. 检查CLI与Web环境的php.ini一致性
CLI和Web服务器可能使用不同的php.ini配置文件,即使CLI中扩展正常,升级脚本依赖的Web环境配置可能存在问题。执行以下命令确认配置路径:
# 查看CLI使用的php.ini路径 php7.4 --ini # 查看Web环境的php.ini路径(以Nginx+FPM为例) php7.4-fpm -i | grep "Loaded Configuration File"
若路径不同,确保Web环境的php.ini中启用了pdo_mysql和mysqli,且未被disable_functions禁用。
2. 手动指定数据库驱动
修改config/settings.inc.php文件,手动设置数据库驱动:
找到行:
define('_DB_CLASS_', '');
替换为:
// 优先使用PDO define('_DB_CLASS_', 'DbPDO'); // 或使用mysqli // define('_DB_CLASS_', 'DbMySQLi');
保存后重新执行upgradeDb命令。
3. 清除缓存并重启服务
升级过程中Opcache可能缓存旧类文件,导致扩展检测失效:
- 重启PHP-FPM或Web服务器清除Opcache
- 删除
var/cache目录下的所有文件(保留.htaccess) - 重新执行升级命令
4. 以Web服务器用户身份执行升级
避免权限差异导致的问题,使用与Web服务器相同的用户(如www-data)执行升级命令:
sudo -u www-data php7.4 modules/autoupgrade/cli-upgrade.php --dir=admin9254z9q7u --action=upgradeDb --data=...
5. 验证数据库连接配置
确认config/settings.inc.php中的数据库主机、用户名、密码、库名配置正确,确保升级过程中未被篡改。
内容的提问来源于stack exchange,提问作者Polak
相关产品推荐
相关产品推荐

