应使用XAMPP的Apache而非bin/cake server,通过httpd-vhosts.conf配置多端口VirtualHost并启用mod_rewrite、AllowOverride All及intl/mbstring/openssl扩展,确保webroot入口和.htaccess生效。

bin/cake server 在 XAMPP 环境下基本不可用——它会和 Apache 冲突、挂起、无法访问,且不走 XAMPP 的配置体系。你要的不是“启动 CakePHP 自带服务器”,而是让 CakePHP 应用跑在 XAMPP 的 Apache 上,用不同端口(比如 :8080、:8081)区分多个项目。
为什么 bin/cake server 在 XAMPP 里会挂住
它默认监听 localhost:8765,但一旦你开着 XAMPP 的 Apache(占着 :80),它本身又没做端口冲突检测;更关键的是,XAMPP 的 PHP 配置(如 php.ini 路径、扩展路径、时区)完全独立于 CLI 的 PHP,所以即使你在终端里 php -m | grep intl 看到 intl,Apache 实际加载的 PHP 可能根本没启用它——导致 bin/cake server 启动后立即卡死在 require 阶段,或报 Fatal error: You must enable the intl extension。
常见表现:
- 终端输出
Server running on http://localhost:8765/后光标不动,Ctrl+C也无响应 - 浏览器访问
localhost:8765显示 “connecting…” 无限等待 - Apache 日志里没记录,CLI 进程实际已僵死
正确做法:用 Apache VirtualHost 绑定不同端口
不改 CakePHP 源码,不碰 bin/cake server,直接复用 XAMPP 的 Apache,靠 httpd-vhosts.conf + 端口监听实现多项目隔离。
立即学习“PHP免费学习笔记(深入)”;
操作步骤:
- 编辑
/Applications/XAMPP/xamppfiles/etc/httpd.conf(macOS)或C:\xampp\apache\conf\httpd.conf(Windows),确认已启用:Include etc/extra/httpd-vhosts.conf(取消注释) - 编辑
etc/extra/httpd-vhosts.conf,添加两个监听不同端口的<VirtualHost>块,例如:
Listen 8080
Listen 8081
<VirtualHost *:8080>
DocumentRoot "/Applications/XAMPP/xamppfiles/htdocs/myapp1/webroot"
ServerName localhost
<Directory "/Applications/XAMPP/xamppfiles/htdocs/myapp1/webroot">
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:8081>
DocumentRoot "/Applications/XAMPP/xamppfiles/htdocs/myapp2/webroot"
ServerName localhost
<Directory "/Applications/XAMPP/xamppfiles/htdocs/myapp2/webroot">
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
- 确保每个 CakePHP 项目的
webroot目录可被 Apache 访问(权限 755,非 777) - 重启 XAMPP 的 Apache(不是整个 XAMPP)
- 浏览器访问
http://localhost:8080和http://localhost:8081即可并行运行两个 CakePHP 应用
必须检查的三个扩展:intl、mbstring、openssl
XAMPP 的 Apache 和 CLI PHP 使用同一份 php.ini,但加载逻辑不同——Apache 启动时只读取它自己加载路径下的 php.ini,而 macOS 上常存在多份(系统自带、Homebrew、XAMPP),极易搞混。
验证方式(不是看终端,是看 Apache 输出):
- 在 XAMPP 的
htdocs下放一个info.php:<?php phpinfo(); ?> - 通过
http://localhost/info.php打开,搜索Loaded Configuration File,确认路径指向 XAMPP 的php.ini(如/Applications/XAMPP/xamppfiles/etc/php.ini) - 在该文件中确认以下三行已取消注释且路径正确(Windows 用
.dll,macOS/Linux 用.so):
extension=intl extension=mbstring extension=openssl
- 特别注意 macOS 上
intl依赖libicu,若报dlopen: cannot load library,需用brew install icu4c并在php.ini中加:intl.icu_dll=libicu
Webroot 路径和 .htaccess 是硬伤点
CakePHP 4+ 强制要求请求入口为 webroot/,且依赖 .htaccess 重写 URL。XAMPP 默认禁用 AllowOverride,导致 404 或白屏。
关键检查项:
-
httpd-vhosts.conf中每个<Directory>块必须含AllowOverride All(不是None) - 确保
webroot/.htaccess文件真实存在(不是被 Git 忽略或误删) - 确认 Apache 已启用
mod_rewrite:在httpd.conf中检查LoadModule rewrite_module modules/mod_rewrite.so是否启用 - 如果仍 404,临时在
webroot/index.php顶部加die('reached');,确认是否进得来——进不来就是 VirtualHost 或 DocumentRoot 错了;进来但路由 404,就是.htaccess或AllowOverride问题
端口本身没玄机,真正卡住人的永远是 Apache 配置粒度、PHP 扩展加载路径、以及 CakePHP 对 webroot 入口的刚性要求——这三个地方错一个,多端口就只是镜花水月。



















