php spark serve 启动失败主因是命令未识别(需用 php vendor/bin/spark serve)或端口被占(默认8080,可改用--port=8000),同时 app.baseurl 配置错误会导致静态资源404。

php spark serve 启动失败:端口被占或命令未识别
直接运行 php spark serve 报错“command not found”或“Address already in use”,说明环境没准备好。CI4 的 spark 是基于 Composer 自动注册的二进制脚本,不是全局命令。
确保你已在项目根目录下执行,且 vendor/bin/spark 存在(Composer 安装后自动生成)。若仍提示找不到命令,尝试显式调用:php vendor/bin/spark serve。
端口冲突常见于本地已有服务监听 8080(默认端口),可换端口启动:
php spark serve --port=8000php spark serve --host=127.0.0.1 --port=8001
注意:PHP 内置服务器不读取 .htaccess,所以路由完全依赖 public/index.php 的前端控制器逻辑——只要 public/ 是 Web 根目录(spark 默认就是),就能正确处理所有 CI4 路由。
静态资源 404:app.baseURL 配置错误
页面能打开,但 CSS、JS、图片全 404,大概率是 app.baseURL 没设对。CI4 用它拼接 asset URL(如 base_url('css/app.css')),不是靠当前请求地址自动推断。
检查 .env 文件中这一行是否已取消注释并匹配你访问的地址:
- 本地用
php spark serve→ 访问http://localhost:8080→ 设为app.baseURL = 'http://localhost:8080' - 改了端口(比如
--port=3000)→ 必须同步改成app.baseURL = 'http://localhost:3000' - 用了
--host=mydev.test→ 必须设app.baseURL = 'http://mydev.test:8080'(端口不能省)
漏掉协议(http://)、写错端口、或留空都会导致 base_url() 返回空字符串或错误路径。
修改代码后要手动刷新?热重载不生效
CI4 的 php spark serve **不带文件监听或自动重启功能**,它只是 PHP 内置服务器的封装,和 php -S 行为一致。改完控制器、视图或配置,浏览器按 F5 就行,不需要 stop/start 服务。
但要注意两点:
- 如果改的是
app/Config/*.php或.env,部分配置(如app.debug、database.default.*)会在请求时重新加载,无需重启;但某些底层服务(如数据库连接池)可能缓存旧配置,此时重启更稳妥。 - 别指望它像 Laravel Mix 或 Vite 那样自动编译前端资源——CSS/JS 变更仍需手动构建或使用外部工具。
为什么不能用 php -S localhost:8000 直接启动?
可以启动,但会路由失效,返回 404。因为 php -S 默认只服务当前目录下的真实文件,不转发请求到 public/index.php。而 CI4 要求所有请求都经由该入口,否则无法触发路由解析。
php spark serve 的关键作用是自动注入一个路由器回调(router.php),把非静态资源请求全部重写到 public/index.php。等价于手动写:
php -S localhost:8000 router.php
其中 router.php 内容由 spark 自动生成并临时托管——你不用管它,但必须用 spark serve 启动才能获得这个能力。
真正容易被忽略的是:哪怕你只改了一行路由配置,只要没清 writable/cache/ 下的路由缓存(开发模式默认关闭缓存),就立刻生效;但如果你在生产环境误开了路由缓存,改了 app/Config/Routes.php 后必须手动删缓存文件,否则新路由永远不生效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











