windows开发必须用workerman/workerman-for-win,linux部署前需启用pcntl/posix扩展、重装vendor依赖、改用php start.php start -d启动,并安装event扩展突破256连接限制。

你在Windows上写好了Workerman聊天服务,本地测试一切正常,但一放到Linux服务器就报错、连接数上不去、进程数不生效、甚至启动就闪退——这不是代码问题,是开发环境和部署环境底层机制不兼容导致的。
确认Windows开发时用对了版本
打开你的项目根目录,检查composer.json里require段中Workerman的依赖项:必须是workerman/workerman-for-win,而不是通用版workerman/workerman。后者在Windows下会因缺少pcntl扩展直接崩溃,而workerman-for-win是官方专为Windows封装的兼容层。
如果已错误安装通用版,先执行composer remove workerman/workerman,再运行composer require workerman/workerman-for-win。
这一步不做,后续所有Linux部署都会因Windows端代码依赖了Windows专属逻辑(比如select()轮询)而无法平滑迁移。
Linux部署前必须做的三件事
第一步:确认PHP版本≥5.4且已启用pcntl和posix扩展。
在Linux终端执行php -m | grep -E "^(pcntl|posix)$",若无输出,说明缺失——CentOS用户运行yum install php-process -y,Ubuntu/Debian用户运行apt-get install php-cli php-dev -y && pecl install pcntl posix(注意:部分新版PHP已内置,无需额外安装)。
第二步:把Windows开发目录里的Applications文件夹整个复制到Linux服务器对应位置,不要复制vendor目录——Linux环境需重新生成依赖,直接拷过去会导致扩展加载失败或路径错乱。
第三步:在Linux服务器上重新执行composer install(或composer update),让Composer根据Linux环境自动适配扩展和autoload规则。这一步跳过,Worker::runAll()会因自动加载器找不到类而Fatal error。
启动脚本必须重写
Windows下你可能用start_for_win.bat双击启动,但Linux下必须改用PHP CLI命令行方式:
方法一:前台调试启动(开发验证用)php start.php start
方法二:后台守护进程启动(生产环境唯一合法方式)php start.php start -d
⚠️ 注意:Linux下绝对不要用nohup php start.php start &代替-d——Workerman的-d参数会调用setsid()创建新会话并重定向标准IO,而nohup只是忽略SIGHUP,无法完成真正的守护进程化,会导致子进程残留、日志错乱、信号处理失效。
启动后检查进程:ps aux | grep 'php start.php',应看到主进程+多个worker子进程;若只看到一个进程,说明$worker->count未生效——大概率是PHP未加载pcntl扩展。
连接数卡在256?立刻装event扩展
Windows版Workerman默认用select()做I/O复用,硬性限制256连接;Linux虽无此限制,但若没装event或libevent扩展,高并发下性能会断崖式下跌。
CentOS系统执行:
① yum install libevent-devel -y
② pecl install event(提示Include libevent OpenSSL support [yes]时输入no)
③ echo "extension=event.so" > /etc/php.d/30-event.ini(路径以php --ini输出为准)
Ubuntu系统执行:
① apt-get install libevent-dev -y
② pecl install event
③ echo "extension=event.so" > /etc/php/$(php -r "echo PHP_MAJOR_VERSION.PHP_MINOR_VERSION;")/cli/conf.d/30-event.ini
装完重启PHP服务或直接运行php --ri event验证是否加载成功。没这步,1000+并发时CPU会飙到100%,连接超时频发。











