PrestaShop 1.7.5切换PHP版本后网站故障求助(回退版本仍无效)
嘿,我之前处理过不少PHP版本切换后PrestaShop出问题的案例,你的情况很典型——升级PHP7.3后网站挂了,回退7.0还是不行,核心报错是找不到PrestaShop\PrestaShop\Core\Cldr\Repository类。先把你的报错信息贴出来方便大家定位:
(1/1) ClassNotFoundException
Attempted to load class "Repository" from namespace "PrestaShop\PrestaShop\Core\Cldr".
Did you forget a "use" statement for e.g. "PrestaShop\PrestaShop\Core\Cldr\Repository", "PrestaShop\PrestaShop\Core\Localization\Currency\Repository" or "PrestaShop\PrestaShop\Core\Localization\Locale\Repository"?
in Tools.php line 724
at ToolsCore::getCldr(object(Context)) in Currency.php line 101
at CurrencyCore->__construct('1') in Currency.php line 614
at CurrencyCore::getCurrencyInstance('1') in Tools.php line 685
at ToolsCore::setCurrency(object(Cookie)) in FrontController.php line 350
at FrontControllerCore->init() in Controller.php line 262
at ControllerCore->run() in Dispatcher.php line 511
at DispatcherCore->dispatch() in index.php line 28
为啥回退PHP还是不行?
其实这个问题和PHP版本本身关系不大,更多是版本切换过程中触发的缓存残留、文件权限变化或者自动加载映射失效。回退PHP只是恢复了运行环境,但之前的错误状态已经留在缓存或者文件系统里了。
一步步解决问题
按这个顺序来,基本能搞定:
先清PrestaShop的缓存!这是最常见的原因
- 能进后台的话,直接去「高级参数 > 性能」页面,点清空缓存按钮就行
- 进不去后台的话,手动删网站根目录下
var/cache/里的所有文件(别删那个index.php就行),包括prod和dev子文件夹里的内容 - 另外,浏览器的缓存也清一下,有时候前端缓存也会捣乱
检查文件权限,很多人忽略这个
PHP版本切换时,服务器可能会改动文件的所属用户或权限,导致PrestaShop读不到核心类文件。你可以:- 把所有文件权限改成
644,目录改成755 - 确保web服务器用户(比如
www-data、apache)对整个网站目录有读取权限 - 用SSH批量改权限的话,执行这两句(替换成你的网站路径):
find /path/to/your/site -type f -exec chmod 644 {} \; find /path/to/your/site -type d -exec chmod 755 {} \; chown -R www-data:www-data /path/to/your/site
- 把所有文件权限改成
刷新OPcache(如果开了的话)
很多服务器会开OPcache来加速PHP,但版本切换后旧的类缓存还在,就会导致找不到新的(或者回退后的)类文件。解决办法:- 直接重启web服务器,比如
systemctl restart apache2或者systemctl restart nginx,重启后OPcache会自动清空 - 要是不想重启服务器,也可以写个临时PHP脚本执行重置:
<?php opcache_reset(); echo "OPcache重置成功"; ?>
上传到网站根目录访问一下,然后赶紧删掉这个脚本,别留安全隐患
- 直接重启web服务器,比如
确认核心类文件没丢
去网站根目录的src/Core/Cldr/文件夹里看看Repository.php文件在不在,内容是不是完整的。如果文件丢了或者损坏,从你用的PrestaShop版本的安装包里面把这个文件提出来上传回去就行。重新生成自动加载映射
PrestaShop用Composer管自动加载,版本切换后自动加载的映射可能失效了。SSH进网站根目录,执行:composer dump-autoload要是没装Composer,先装一个再执行就行。
要是还不行怎么办?
看看服务器的PHP错误日志,里面可能有更详细的报错信息,比如是不是还有其他依赖类没找到,或者数据库连接有问题。实在不行,就重新部署一下PrestaShop的核心文件(别覆盖自己的主题和插件)。
内容的提问来源于stack exchange,提问作者Daniel Halls

