Workerman不是PHP扩展,无需也不存在“一键安装”;它依赖pcntl、posix、event三个PHP扩展,需手动启用并验证;启动脚本须显式require Autoloader.php,不走Composer自动加载。

宝塔“一键安装Workerman扩展”根本不存在
宝塔面板软件商店里没有、也从来不会有“Workerman扩展”这个东西。Workerman 不是 PHP 扩展(如 event 或 pcntl),它是一个纯 PHP 编写的常驻进程框架,不通过 extension= 加载,也不进 php.ini。你看到的所谓“一键安装”,要么是误标名称的第三方脚本,要么是悄悄执行了 git clone 或下载 Worker.php 的操作——但那不是“安装扩展”,只是复制文件。
Composer require workerman/workerman 为什么大概率失败
官方从未在 Packagist 上发布过稳定版 workerman/workerman 包。你执行 composer require workerman/workerman 时,Composer 实际拉取的可能是:
- 某个已归档或无人维护的 fork 仓库(比如 2018 年的旧分支)
- 空包(
composer.json有但没实际代码) - 非官方镜像,版本错乱、缺少
Autoloader.php或路径结构不匹配
结果就是:装完了,require 'vendor/autoload.php' 后仍报 Class 'Workerman\Worker' not found;或者启动时报 undefined function pcntl_fork() —— 因为 Composer 只管下代码,不管 PHP 扩展有没有启用。
真正要装的是这三个 PHP 扩展,不是 Workerman 本身
Workerman 能否跑起来,取决于底层三个系统级能力,它们必须手动启用:
立即学习“PHP免费学习笔记(深入)”;
-
pcntl:用于fork子进程,没它 Worker 进程根本起不来 -
posix:处理kill -USR1等信号,热重启依赖它 -
event(或libevent):替换 PHP 默认的stream_select,否则长连接撑不过 1024 连接,心跳也不准
这些扩展在宝塔里不能靠“软件商店点一下”就生效。你必须:
- 进终端,确认 PHP CLI 路径(如
/www/server/php/82/bin/php) - 编辑对应版本的
php.ini,取消extension=pcntl和extension=posix的注释 - 对
event还得先装libevent-devel,再用phpize编译安装 - 最后重启该 PHP 版本的服务,再用
/www/server/php/82/bin/php -m | grep -E "pcntl|posix|event"验证
Workerman 启动不走 Composer autoload,只认 require 路径
Workerman 的启动脚本(如 start.php)必须显式 require 其核心文件,例如:
require_once __DIR__ . '/Workerman/Autoloader.php';
use Workerman\Worker;
Worker::$pidFile = __DIR__ . '/workerman.pid';
$worker = new Worker('tcp://0.0.0.0:1234');
$worker->onMessage = function($connection, $data) { $connection->send('hello'); };
Worker::runAll();
它不依赖 PSR-4 自动加载,也不读 vendor/autoload.php。所以即使你用 Composer 把包下到了 vendor/,只要没把 Workerman/ 目录放对位置、没在 start.php 里正确 require,照样启动失败。很多问题其实卡在这一行路径写错了,而不是“没装好”。



















