根本原因是Concrete5 8.x的Doctrine代理类生成机制与Apache多端口虚拟主机路径解析冲突,导致共享proxies目录引发写入失败或读取空目录。

为什么Concrete5在XAMPP多端口下报__CG__ConcreteCoreEntitySiteType.php找不到?
根本原因不是端口本身,而是Concrete5 8.x的Doctrine代理类生成机制与Apache虚拟主机路径解析冲突。当你用http://localhost:8080和http://localhost:8081分别访问两个Concrete5站点时,如果它们共享同一application/config/doctrine/proxies目录(默认路径由APP_PATH决定),Doctrine会尝试写入同名代理文件,但因opcache或文件锁导致写入失败或读取空目录——最终触发require(): failed to open stream错误。
必须改掉的httpd.conf三处配置
多端口部署Concrete5前,仅靠Listen 8080和Listen 8081远远不够。以下三项漏一即失效:
-
ServerName必须显式设为localhost:8080(不能只写localhost),否则Apache启动时校验失败 -
DocumentRoot路径中的反斜杠\在Windows下要全改为正斜杠/,例如D:/xampp/htdocs/site1,否则httpd -t语法检查报错 - 每个
块内必须包含,否则返回403 ForbiddenRequire all granted
Concrete5项目级隔离:避免代理类冲突
不同端口的Concrete5实例必须彻底隔离application目录,否则doctrine/proxies会互相覆盖。不要复用同一套源码:
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
- 复制完整Concrete5安装包到不同目录,例如
D:/xampp/htdocs/concrete5-site1和D:/xampp/htdocs/concrete5-site2 - 编辑各自
application/config/doctrine.php,将'proxy_dir' => DIR_APPLICATION . '/config/doctrine/proxies'改为绝对路径,如'proxy_dir' => 'D:/xampp/htdocs/concrete5-site1/application/config/doctrine/proxies' - 首次访问任一站点前,手动创建对应
proxies目录并赋予Apache写权限(Windows下右键→属性→安全→编辑→添加Everyone并勾选“完全控制”)
验证顺序不能乱:先httpd -t再浏览器
每次改完httpd-vhosts.conf或httpd.conf,必须执行以下命令验证,否则Apache可能静默失败:
- 以管理员身份打开命令行,进入
D:/xampp/apache/bin - 运行
httpd -t,输出Syntax OK才代表配置无误 - 若提示
Invalid command 'Require',说明mod_authz_core模块未启用,需在httpd.conf中取消#LoadModule authz_core_module modules/mod_authz_core.so的注释 - 重启Apache后,直接访问
http://localhost:8080/install.php,不要跳过安装流程——Concrete5 8.x不支持“直接放源码就运行”
Concrete5的proxies目录不是缓存,是运行时必需的代码生成产物;端口切换不会自动重建它,必须为每个实例分配独立路径并确保可写。










