tinywan/webman-typephp 是面向 Webman 2.x 的 TypePHP AOT 构建插件。它会从现有 Webman 项目生成 AOT 入口和 Linux 编译配置,再交给固定版本的 Docker builder 完成编译,最后整理出可以复制到目标服务器的 dist/ 目录。
宿主机只需要 PHP、Composer 和 Docker,不需要安装 C++、Clang 或 TypePHP 编译工具链。
- ⚡ 一键构建:自动生成
main.php与project.linux.yml,统一调度 Docker 编译环境。 - 🧩 全版本 Webman 兼容:自动把
webman-framework的helpers.php与fast-route的functions.php平铺为 AOT 专用版本(.typephp/build/),规避新版框架顶层if守卫触发的Unsupported statement: Stmt_If编译错误或静默跳过,同时保证base_path()、config()、FastRoute\simpleDispatcher()等全局函数完整编译进二进制。 - 🩹 协程静态属性补丁:自动把
workerman/coroutine的Context/WaitGroup/Barrier中未初始化的标量静态属性补成可空并默认null(.typephp/build/),规避 TypePHP 编译产物把未初始化标量静态读作零值导致??=守卫失效、进而触发Invalid callback ::destroy崩溃循环的问题。 - 🔧 可变参数闭包补丁:自动把
Worker/TcpConnection/AsyncTcpConnection/Select/webmanFile中签名不足的错误处理与信号闭包补成可变参数形态(.typephp/build/),规避 TypePHP 编译产物对闭包调用强制精确参数个数(PHP 语义允许多传忽略)导致每次 accept 抛ArgumentCountError、worker 崩溃循环的问题。 - 📦 目录化交付:输出原生二进制、启动脚本、运行库和 Webman 资源,结构清晰、便于发布。
- 🛡️ 安全默认值:已有输出不会被静默覆盖;必须显式使用
--force,旧目录会先备份。 - 🧾 可追溯构建:
build-manifest.json记录输入摘要、镜像和构建时间,不写入密钥或令牌。 - ☁️ CI/CD 就绪:可生成 Linux amd64 构建工作流,并由 Git tag 触发 Docker Hub 镜像发布。
在 Webman 项目根目录执行:
composer require tinywan/webman-typephp --dev确认 PHP 版本、Docker CLI 和 Docker daemon 可用:
php webman typephp:doctor# 默认输出到 dist/
php webman typephp:package
# dist/ 已存在时,显式确认覆盖
php webman typephp:package --force
# 强制使用最新 TypePHP stub 重置 main.php 入口(原有 main.php 会自动备份为 main.php.bak)
php webman typephp:package --refresh-main默认 builder 为 tinywan/typephp-webman-builder:v0.1.0。编译在 Docker 中完成,宿主机不需要 C++、Clang 或 TypePHP 编译器。
将 dist/ 复制到兼容的 Linux x86_64/glibc 服务器,在目录内启动:
cd dist
./start.sh startstart.sh 会自动指定 PHPRC 加载随包的 php.ini,并将随包发布的 lib/ 加入动态库搜索路径。也支持 Webman 常用命令:
./start.sh start -d
./start.sh status
./start.sh stop
./start.sh restart也可以直接通过包装脚本启动:
./webman-server start成功构建后的完整目录结构如下(与全静态便携环境 100% 对齐):
dist/
├── webman-server.bin # TypePHP 生成的 ELF 原生二进制
├── webman-server # 启动包装脚本(自动载入 php.ini 与底层动态库)
├── start.sh # 标准 Workerman 启动脚本
├── libphp.so # PHP 核心运行时共享库
├── libphpx.so # PHPX 运行时共享库
├── php.ini # 自包含纯净 PHP 运行时配置
├── ext/ # 随包分发的 PHP 核心与网络扩展模块 (.so)
├── lib/ # 随包发布的底层系统与扩展动态依赖库 (ldd 完整收集)
├── runtime/ # 运行时缓存与日志目录 (logs, views)
├── build-manifest.json # 输入、镜像与时间等构建元数据
├── config/ # 项目运行时配置(若存在)
├── public/ # 静态资源(若存在)
└── app/view/ # 视图模板(若存在)
lib/ 携带构建及扩展所需的所有动态依赖库;glibc、动态加载器由目标系统提供。build-manifest.json 用于追踪构建,不应写入密钥、令牌或其他敏感信息。
| 命令 | 说明 |
|---|---|
php webman typephp:package |
使用默认 builder 构建 Linux portable-dir |
php webman typephp:package --force |
覆盖已有输出,并保留旧目录备份 |
php webman typephp:package --refresh-main |
强制从最新官方 stub 刷新 main.php(旧文件自动备份) |
php webman typephp:package --image=... |
使用指定且经过验证的 Docker 镜像 |
php webman typephp:doctor |
检查 PHP、Docker 和构建前置条件 |
php webman typephp:init-ci |
生成 Linux amd64 GitHub Actions 工作流 |
安装插件后,配置文件位于 config/plugin/tinywan/typephp/app.php:
return [
'enable' => true,
'docker' => [
'enabled' => true,
'image' => 'tinywan/typephp-webman-builder:v0.1.0',
],
'build' => [
'output_name' => 'webman-server',
'dist_dir' => 'dist',
'clean_build' => true,
],
];当前第一阶段只承诺已经验证的组合:
- 目标平台:
linux/amd64。 - 运行时:glibc 动态 portable-dir。
- 交付方式:
webman-server.bin、start.sh、lib/与 Webman 运行资源组合分发。 - 编译方式:固定版本 Docker builder,镜像版本与发布 tag 对齐。
当前不宣称单文件、完全静态链接或所有 Linux 发行版通用。目标服务器需要兼容的 x86_64/glibc 运行环境。
第二阶段计划包括 Composer 依赖审计、更多 Webman/扩展 fixtures、ARM64 构建与测试、增量缓存,以及在独立验证后再评估静态链接、资源嵌入和单文件交付。
普通使用者无需执行本节。推送符合 vMAJOR.MINOR.PATCH 格式的 Git tag(例如 v0.0.10)后,GitHub Actions 会自动构建并推送同名的 Linux amd64 镜像:
Git tag v0.0.10 → GitHub Actions → tinywan/typephp-webman-builder:v0.0.10
仓库需要配置 DOCKER_USERNAME 和 DOCKER_PASSWORD,其中密码必须是 Docker Hub Access Token。工作流只发布与 Git tag 完全一致的版本标签,不发布 latest、alpine 或其他浮动标签。
完整流程参见 RELEASING.md。
项目使用 Pest 编写测试,使用 Mago 进行格式化、lint 和静态分析:
composer test
composer format:check
composer lint
composer analyze
composer check测试不得连接生产、真实业务或共享数据库;涉及数据库时必须使用一次性隔离环境,优先使用 SQLite :memory:。
MIT © Tinywan