Webman启动时强制要求app/目录下必须存在controller/和middleware/子目录,缺一则报错退出;model/和view/按需创建,其余子目录名须小写单数。

app/ 目录必须包含 controller/ 和 middleware/ 子目录
Webman 启动时会硬性检查 app/controller/ 和 app/middleware/ 是否存在,缺一不可。哪怕你暂时不用中间件,也得留个空目录,否则 php start.php start 会直接报错退出,错误信息类似 Directory not found: app/middleware。
控制器文件必须放在 app/controller/ 下,类名需与文件名一致,且继承 Webman\Controller;中间件类同理,放在 app/middleware/,实现 Webman\MiddlewareInterface 或继承 Webman\Middleware。
-
app/model/和app/view/不是强制要求,按需创建 - 若项目用到视图渲染,
app/view/路径由config/view.php中的view_path配置项决定,默认就是app/view/ - 所有
app/下的子目录名必须小写、单数(如不能叫controllers或Models)
config/ 目录里 database.php 和 app.php 是启动必读配置
Webman 在初始化阶段会自动加载 config/app.php 和 config/database.php(如果存在)。前者控制框架行为开关,比如 controller_reuse 决定控制器是否复用实例;后者若缺失或语法错误,会导致数据库连接失败,但服务仍能启动——只是后续调用 Db:: 时才抛出异常。
注意:配置文件必须返回纯 PHP 数组,不能含 echo/print、不能有 BOM 头、不能用短数组语法 [] 以外的写法(PHP 7.4+ 兼容,但低版本会 fatal error)。
立即学习“PHP免费学习笔记(深入)”;
-
config/route.php是路由定义入口,不放这里就无法注册任何 HTTP 路由 - 自定义配置文件(如
config/cache.php)需手动通过config('cache')调用,不会被自动加载 - 环境区分靠
.env+config/bootstrap.php加载逻辑,不是靠目录名(如 config/prod/)
public/ 是唯一可被 Web 服务器直接访问的目录
Web 服务器(Nginx/Apache)的 root 或 DocumentRoot 必须指向 public/,否则 index.php 无法作为入口,且 app/、config/ 等敏感目录可能被直接下载泄露。
public/index.php 是传统 CGI 入口(用于调试或 FPM 模式),而正式部署推荐用 public/start.php 启动常驻进程。两者加载逻辑不同:start.php 会跳过部分 CLI 初始化步骤,更贴近生产环境行为。
-
public/下的静态资源(CSS/JS/images)路径必须与代码中引用的 URL 完全一致,无自动重写 - 不要在
public/里放 PHP 配置文件或日志,它们会被暴露 - 若用 Nginx,务必确认
location ~ \.php$块中fastcgi_param SCRIPT_FILENAME指向的是$document_root$fastcgi_script_name,而非硬编码路径
runtime/ 目录必须可写,且不能提交到 Git
runtime/ 用于存放日志、缓存、session 文件和 PID,Webman 进程启动时会尝试创建 runtime/log/ 和 runtime/cache/。如果权限不足,你会看到类似 file_put_contents(runtime/log/202605.log): failed to open stream: Permission denied 的警告,日志写入失败,但进程不会退出。
该目录默认被 .gitignore 排除,切勿手动取消忽略——里面的内容是运行时生成的,每次部署都应清空或保留旧日志归档,而不是版本化。
-
runtime/log/下的日志按天滚动,文件名格式为YYYYMM.log,不支持自定义格式 -
runtime/pid/存储 worker 进程 PID,重启前需确保旧 PID 文件已清理,否则php start.php restart可能失败 - 若用 Docker,建议将
runtime/挂载为 volume,避免容器重建后丢失日志上下文
app/middleware/ 目录的强制存在性,以及 runtime/ 权限未提前设置导致上线后日志静默丢失——这两处问题往往要等到压测或线上报错才暴露,排查成本远高于初始化时多敲两行命令。



















