必须用Docker运行Workerman 4.0.10,因需环境隔离、进程可控、端口映射和日志采集;宿主机直接启动无法保障多进程一致性、优雅重启及内存限制,且必须启用pcntl和posix扩展,禁用daemonize并绑定0.0.0.0。

将 Workerman 4.0.10 应用稳定运行在生产环境,必须通过 Docker 实现环境隔离、进程可控、端口可映射、日志可采集——不能直接在宿主机上 php start.php start,否则无法保障多进程行为一致性、无法优雅重启、无法限制内存溢出风险。
准备基础镜像与扩展依赖
Workerman 4.0.10 要求 PHP ≥ 7.4,且【pcntl 和 posix 扩展必须启用】,缺一不可;event 或 libevent 为可选,但推荐启用以提升 I/O 性能。Alpine 镜像体积小但 musl libc 兼容性偶发问题,生产环境优先选用 debian 或 ubuntu 系基础镜像。
执行以下命令验证本地 Docker 环境可用:
docker --version && docker run --rm hello-world
拉取稳定 PHP 基础镜像(推荐 php:8.1-cli):
docker pull php:8.1-cli
编写最小可行 Dockerfile
在项目根目录新建 Dockerfile,内容如下(逐行解释):
第一行指定基础镜像:FROM php:8.1-cli
安装 pcntl 和 posix 扩展(Workerman 多进程核心依赖):RUN docker-php-ext-install pcntl posix
若需 WebSocket 或高并发优化,再安装 event 扩展:RUN pecl install event && docker-php-ext-enable event
复制项目代码到容器内:COPY . /app
设置工作目录并切换:WORKDIR /app
安装 Composer 并执行依赖安装(注意:--no-dev 可减小镜像体积,--optimize-autoloader 提升加载性能):RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && composer install --no-dev --optimize-autoloader
声明入口启动命令(关键:必须用 start 模式,不能用 start -d,因容器内无 init 进程管理守护进程):CMD ["php", "start.php", "start"]
确保 start.php 符合容器运行规范
Workerman 4.0.10 的 start.php 必须显式禁用 daemonize,否则容器会立即退出:
在 $worker = new Worker(...) 初始化后、Worker::runAll() 之前,加入这一行:
$worker->daemonize = false;
同时确认监听地址绑定为 0.0.0.0(而非 127.0.0.1),否则容器外无法访问:
$worker = new Worker('websocket://0.0.0.0:2345');
若使用 HTTP 协议,同理:new Worker('http://0.0.0.0:8080');
⚠️ 注意:Workerman 4.x 默认开启 reloadable,但容器内不建议依赖 reload,应通过重建容器升级代码。
构建并运行单实例容器
方法一:命令行直接构建运行
MiniMax 图片理解 + 网络搜索 MCP 工具。适配 Docker 环境(极空间等),支持图片 OCR 识别、图像内容理解、网络搜索。API Key 安全存储在本地 credentials 文件,不暴露在代码中。
在项目根目录执行:docker build -t workerman4-app .
运行容器并映射端口(假设 start.php 监听 2345):docker run -d --name wm4 -p 2345:2345 workerman4-app
查看日志确认服务已就绪:docker logs -f wm4,正常输出类似 Workerman[xxx] start in DEBUG mode 即表示启动成功。
方法二:使用 docker-compose.yml 编排(更易维护)
新建 docker-compose.yml:
version: '3.8'
services:
workerman:
build: .
container_name: workerman4
ports:
- "2345:2345"
restart: unless-stopped
# 关键:关闭标准输入,避免容器因 stdin 关闭而退出
stdin_open: false
tty: false
启动:docker-compose up -d
验证容器内多进程行为
进入容器检查实际运行的 PHP 进程数:
docker exec -it workerman4 ps aux | grep php
应看到至少 2 个进程:主进程(含事件循环)+ 子 Worker 进程(数量由 $worker->count = N 控制)。
若只看到 1 个 php 进程,说明 pcntl 扩展未生效或 daemonize = true 未设为 false,容器将无法正确 fork 子进程。
修改 start.php 中的进程数示例:$worker->count = 4; → 重新构建镜像 → docker-compose down && docker-compose up -d → 再次 ps 验证。

















