Magento后台配置锁死且执行setup:di:compile报rtrim参数错误求助
Magento后台配置锁定与di:compile编译报错解决方案
问题说明
- 后台调整配置时「Use system value」勾选框为锁定状态,鼠标悬浮显示红色禁止标识,无法修改配置值
- 执行
setup:di:compile命令时报PHP致命错误,已尝试composer install、composer update操作无法解决,当前运行PHP版本为7.4.20
报错日志
Application code generator... 3/9 [=========>------------------] 33% 5 secs 246.0 MiBPHP Fatal error: Uncaught TypeError: rtrim() expects parameter 1 to be string, bool given in /var/www/html/setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php:95 Stack trace: #0 /var/www/html/setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php(95): rtrim() #1 /var/www/html/setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php(286): Magento\Setup\Module\Di\Code\Scanner\PhpScanner->getSourceClassName() #2 /var/www/html/setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php(152): Magento\Setup\Module\Di\Code\Scanner\PhpScanner->shouldGenerateClass() #3 /var/www/html/setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php(184): Magento\Setup\Module\Di\Code\Scanner\PhpScanner->_fetchMissingExtensionAttributesClasses() #4 /var/www/html/setup/src/Magento/Setup/Module/Di/App/Task/Operation/ApplicationCodeGenerator.php(77): Magento\Setup\Module\Di\Code\Scanner\PhpScanner->collectEntities() #5 /var/www/html/setup/src/Magento/Setup/Module/Di/App/Task/Manager.php(56): Magento\Setup\Module\Di\App\T in /var/www/html/setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php on line 95
解决方案
第一步:修复编译报错
这个报错的根源是自定义插件/本地修改代码存在不符合规范的类定义,导致类名解析失败返回布尔值传入rtrim()触发类型错误,按以下步骤修复:
- 打开文件
/var/www/html/setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php,定位到第95行 - 给
rtrim()方法的入参加字符串类型校验,修改前代码示例:
return ltrim(rtrim($className, '\\'), '\\');
修改为:
if (!is_string($className)) { return ''; } return ltrim(rtrim($className, '\\'), '\\');
- 清理所有临时生成文件:
rm -rf var/cache/* var/generation/* var/di/* generated/*
- 重新执行编译命令,编译通过后清理缓存:
php bin/magento setup:di:compile php bin/magento cache:clean php bin/magento cache:flush
第二步:解除后台配置锁定
Magento配置项如果被硬编码写入配置文件,后台就会强制锁定不可修改,两种解决方式可选:
- 配置文件修改方式:备份
app/etc/config.php和app/etc/env.php文件,删除两个文件中对应需要修改的配置项,或者直接修改配置值后保存,清理缓存即可生效 - 数据库修改方式:直接操作
core_config_data表,找到对应配置路径的记录,修改value字段值,确认scope字段为你需要的作用域(默认为default全局),修改后清理缓存即可生效
内容的提问来源于stack exchange,提问作者rudolfssau
相关产品推荐
相关产品推荐

