Workerman 4.0.10 默认不内置静态文件服务,StaticFile 中间件需显式启用、正确注册且顺序合理,否则静态请求将绕过优化直接交由控制器处理;生产环境应交由 Nginx 或 CDN 托管静态资源。

Workerman 4.0.10 默认不内置静态文件服务,若你正用 StaticFile 中间件响应 CSS/JS/IMG 等资源却遭遇延迟高、并发掉帧、缓存头缺失等问题,说明配置未生效或路径匹配逻辑被绕过——这不是性能调优问题,而是服务根本没走优化通路。
确认 StaticFile 中间件是否真正启用
打开 config/static.php,检查 'enable' => true 是否明确写死为布尔值 【true】,而非字符串 'true' 或注释掉的配置项;PHP 的 == 会把字符串 'false' 当作真值,'enable' => 'true' 在条件判断中可能失效。
在 config/bootstrap.php 或启动脚本中,确认 middleware 数组里已显式注册该中间件:app\middleware\StaticFile::class 必须存在,不能仅靠注释说明“已启用”。
中间件顺序必须满足:它得在路由解析完成之后、控制器执行之前触发。若把它放在全局中间件最顶部,$request->path() 还未标准化(比如未去除 query string、未统一斜杠方向),会导致路径匹配失败,静态请求直接 fallback 到后续控制器逻辑。
验证静态请求是否真的进入中间件
临时在 app/middleware/StaticFile.php 的 process() 方法开头插入:file_put_contents('/tmp/static_trace.log', $request->path()."\n", FILE_APPEND);。
用 curl 访问一个真实存在的 JS 文件:curl -I http://localhost:2345/js/app.js,再检查 /tmp/static_trace.log 是否有对应路径记录。没有?说明请求压根没进这个中间件——大概率是路由规则拦截了 /js/* 并交给了控制器处理。
这一步很关键:如果日志里没记录,所有后续优化都是无意义的。别跳过验证,直接改配置。
禁用控制器内手动返回静态文件
搜索全部控制器代码,删除所有形如 return response()->file(...)、return file_get_contents(...) 或 readfile(...) 的语句。
这类写法完全绕过 StaticFile 中间件,既不设置 Cache-Control 头,也不做 MIME 类型推断,更不会触发 ETag 或 Last-Modified 校验——浏览器每次都要重新下载,服务端还要读磁盘+拼响应体,性能损耗翻倍。
如果你的业务确实需要动态生成前端资源(如带版本号的 inline CSS),请改用构建时预生成 + 静态托管,而非运行时读取返回。
生产环境必须剥离静态文件服务
第一步:把 public/ 目录整个移出 PHP 进程,交由 Nginx 直接 location ~* \.(js|css|png|jpg|gif|ico|woff2?|ttf|eot)$ { root /var/www/myapp/public; expires 1y; add_header Cache-Control "public, immutable"; } 服务。
第二步:在 Workerman 启动脚本中彻底删除 app\middleware\StaticFile::class 注册,删掉 config/static.php 文件——让它彻底退出你的运行时链路。
第三步:所有 HTML 中的静态资源 URL 改为绝对路径或 CDN 域名,例如 <script src="https://cdn.example.com/js/app.a1b2c3.js"></script>。
CDN 缓存 + 浏览器强缓存才是静态资源的终极解法。Workerman 的 StaticFile 只适合开发调试兜底,扛不住真实流量。


















