workerman 是网络编程基础库而非开箱即用框架,需手写入口文件(如start.php)并执行php start.php start -d启动;它不提供workerman命令、不支持create-project、无内置cli工具,核心仅含worker等类,依赖pcntl/posix扩展,多进程间状态不共享。

Workerman 不能通过 Composer 安装为“可直接运行的框架”——它不提供 workerman 命令行可执行文件,也不支持 composer create-project 一键启动。你装的是它的核心类库,不是开箱即用的服务进程。想跑起来,必须自己写入口文件、手动启动 Worker 实例。
为什么 composer require workerman/workerman 装完不能直接 php workerman start
Workerman 的设计定位是「网络编程基础库」,不是 Laravel 那种带 CLI 和生命周期管理的“框架”。workerman/workerman 包里只有 Worker 类、Connection 类等核心组件,没有内置命令行工具或 bin/ 启动脚本。
- 常见错误现象:
Command 'workerman' not found或执行php workerman start报错file not found - 真正能执行的只有你自己写的 PHP 入口文件,比如
start.php - 它不依赖
autoload自动注册命令,也不会往vendor/bin/写可执行文件
正确启动方式:手写 start.php + php start.php start -d
所有 Workerman 服务都始于一个 PHP 文件,里面 new 一个或多个 Worker 实例,并调用 Worker::runAll()。
- 典型结构:
Worker实例绑定监听地址(如text://0.0.0.0:2345),设置onMessage回调处理连接 - 必须显式调用
Worker::runAll()才会进入事件循环,否则脚本立即退出 - 启动命令固定为:
php start.php start -d(-d表示守护进程模式);restart/stop也依赖这个文件里的global $argv解析 - 示例最小可运行片段:
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
$worker = new Worker('text://0.0.0.0:2345');
$worker->onMessage = function($connection, $data) {
$connection->send("Hello " . $data);
};
Worker::runAll();
注意 Worker 构造参数和运行环境限制
Workerman 对运行环境敏感,很多问题出在配置细节上,不是代码逻辑错。
-
text://、websocket://、tcp://等协议前缀必须拼写准确,大小写敏感;http://不被原生支持,需配合WebServer扩展 - Linux 下必须用非 root 用户启动(除非加
--user参数指定用户),否则子进程可能无法 fork - PHP 必须启用
pcntl和posix扩展,macOS 默认不启用pcntl,M1/M2 芯片上尤其容易卡在Worker::runAll()不响应 - Windows 下仅支持开发调试(
start不带-d),不支持restart/stop,生产环境必须用 Linux
最常被忽略的一点:Workerman 没有“应用上下文”概念,每个 Worker 实例是独立进程,全局变量、静态属性不共享。状态同步、配置加载、数据库连接复用这些事,得自己用 Redis、Swoole Table 或信号机制来处理,不能指望 Composer 自动帮你理清楚。










