webman 高性能需放弃 php-fpm 直觉,必须使用异步 i/o(如 webman/database)、连接池、预加载,并避免同步阻塞操作与 exit/die;start.php 修改后须 restart,调试输出需用日志而非 var_dump。

Webman 不是“换个名字的 Laravel”,它跑在常驻内存的 Workerman 上,所有请求共享已加载的类、配置和连接池。直接照搬传统 PHP-FPM 博客项目的写法(比如在控制器里反复 new PDO()、用 exit 中断流程、或依赖每次请求都重载的全局变量),轻则性能归零,重则进程崩溃。
start.php 启动脚本改了但没生效?
start.php 是 Webman 的入口和生命周期控制器,不是普通 PHP 文件。
修改后必须显式重启,php start.php reload 对它无效 —— 它本身不参与热重载逻辑。
- 你加了自定义进程?改了
server.php的 worker 数量? - 你调整了
event-loop类型(如从select换成libevent)?
→ 这些都属于「启动时决定」的配置,必须执行php start.php restart - 开发中想省事?启用
monitor进程(默认开启),但它只监听app/、config/等业务目录,不监控start.php或server.php
博客文章列表接口响应慢,查不出瓶颈?
Webman 的「快」建立在异步非阻塞前提下,而 MySQL 原生 PDO 是同步阻塞的。
你在 app/controller/PostController.php 里写 $pdo->query("SELECT * FROM posts"),整个 Worker 进程就卡住了,其他并发请求全得排队。
- 真实项目请用
webman/database扩展(基于workerman/mysql),它提供真正的异步查询:use support\Db;
$posts = Db::table('posts')->where('status', 1)->get(); // 非阻塞
- 如果坚持用 PDO,请至少加上连接池配置(
config/database.php中设置'pool' => ['min' => 2, 'max' => 10]),否则单连接撑不住并发 - 别在循环里查数据库:100 篇文章,100 次
Db::table('categories')->find($post['category_id'])→ 改用with()预加载或一次whereIn批量查
view 模板里 var_dump 显示在终端,页面空白?
这是 Webman 常驻内存模型的必然表现:echo、var_dump、print_r 输出目标是当前 Worker 进程的 stdout(也就是你敲 php start.php start 的那个终端),不是 HTTP 响应体。
- 调试模板变量?用
{{ $title }}直接输出,或在控制器里Log::debug(['title' => $title])写日志 - 想看完整请求上下文?开
config/app.php的'debug' => true,错误会自动转成 JSON 响应(开发期有效) - 绝对不要在视图里写
die或exit:Worker 进程立即退出,触发 Workerman 自动拉起新进程,但当前请求永远收不到响应,浏览器一直转圈
Webman 的「高性能」不是自动继承的,它要求你主动放弃 PHP-FPM 时代的直觉 —— 比如认为「写个 foreach 查库很自然」,或者「file_get_contents 调第三方 API 没问题」。这些操作在常驻进程里会变成雪球,越滚越大。真正难的不是写第一个路由,而是把每个 I/O 动作都换成异步或池化版本。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











