fiberphp / skeleton
📦 FiberPHP 应用骨架 —— 开箱即用的项目模板,集成路由、控制器、配置、中间件,快速启动。
Requires
- php: >=8.3
- fiberphp/console: dev-master
- fiberphp/framework: dev-master
- fiberphp/http: dev-master
- fiberphp/monitor: dev-master
Requires (Dev)
- fiberphp/devtools: dev-master
- fiberphp/ide-helper: dev-master
- phpunit/phpunit: ^11.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is not auto-updated.
Last update: 2026-09-06 15:13:11 UTC
README
FiberPHP 应用骨架包,基于 FiberPHP 框架与 Workerman 构建,用于通过
composer create-project 快速创建新项目。
环境要求
- PHP >= 8.3
- 必需扩展:
pcntl、posix(Workerman 进程模型依赖) - Composer 2.x
快速开始
# 1. 创建项目(依赖已随 create-project 自动安装)
composer create-project fiberphp/skeleton my-project --no-interaction
# 2. 进入项目目录
cd my-project
# 3. 准备环境配置
cp .env.example .env
# 4. 启动服务(前台运行)
php start.php start
默认监听 http://0.0.0.0:8080,访问 http://127.0.0.1:8080 即可。
目录结构
my-project/
├── app/
│ ├── Controller/ # 控制器目录(业务路由推荐注解声明)
│ ├── ExceptionHandler.php # 自定义异常处理(继承 framework Handler)
│ ├── Middleware/ # 应用中间件
│ └── Provider/
│ └── AppProvider.php # 应用级 Provider(框架按约定自动发现)
├── config/
│ ├── app.php # 应用配置(debug / name / boot_order / master_bootstrap / worker_bootstrap)
│ ├── log.php # 日志配置(默认通道 / 缓冲刷盘 / 敏感字段脱敏)
│ ├── server.php # Workerman 全局属性(pid_file / 超时 / 包大小),事件循环固定 Fiber
│ ├── process/ # 进程声明发现目录(子包安装时自动注入,如 http 的 config/process/http.php)
│ └── command/ # 控制台命令发现目录(按需创建,子包/应用放置命令注册文件)
├── docker/ # Docker 构建与部署配置(Dockerfile.base / Dockerfile / docker-compose.yml)
├── public/ # 静态资源目录
├── route/
│ └── app.php # 闭包路由(探针/健康检查等,需 fiberphp/router)
├── runtime/ # 运行时目录(日志、缓存)
├── tests/
│ └── ExampleTest.php # 测试示例
├── .dockerignore # Docker 构建上下文排除规则
├── .env.example # 环境变量模板
├── composer.json
├── Makefile
├── fiberphp # CLI 入口(安装 fiberphp/console 时自动发布,勿手工创建)
└── start.php # 主进程入口
配置说明
环境变量(.env)
复制 .env.example 为 .env 后按需修改:
| 变量 | 说明 | 默认值 |
|---|---|---|
APP_NAME | 应用名称 | fiberphp |
APP_DEBUG | 调试模式(true/false) | false(.env 模板置 true 便于本地开发,生产请置 false) |
SERVER_LISTEN | HTTP 监听地址 | http://0.0.0.0:8787(.env 模板为 8080) |
SERVER_COUNT | HTTP Worker 进程数 | auto(按 CPU 核心数) |
配置文件(config/)
整体结构按「配置键 / 进程发现 / 命令发现」分区:
config/
├── app.php # 应用自身:debug、name、providers/boot_order、master/worker bootstrap
├── log.php # 日志配置(默认通道、缓冲刷盘、敏感字段脱敏)
├── server.php # Workerman Worker 全局属性(pid_file、stop_timeout…),事件循环固定 Fiber
├── process/ # 进程声明发现目录(不进入 config 顶层键,App 专用)
│ ├── http.php # fiberphp/http 安装后注入
│ └── monitor.php # fiberphp/monitor 安装后注入
└── command/ # 控制台命令发现目录(不进入 config 顶层键,按需创建,框架扫描时容错)
子包级配置文件(如安装 fiberphp/http 注入的
config/http.php)在安装对应子包后,由PackageManifest的pathRelation一并注入,出现在config/顶层。
每类文件的详细约定:
- 子包配置(如
config/http.php、config/database.php):通过config('http.xxx')/config('database.xxx')等 dot-key 读取。由对应子包在composer install时通过PackageManifest的pathRelation自动注入;文件已存在时 不覆盖,保留用户自定义。 config/server.php:Workerman Worker 全局属性 (pid_file、status_file、log_file、stdout_file、stop_timeout、max_package_size)。默认写入runtime/logs/目录。事件循环固定为Workerman\Events\Fiber(基于revolt/event-loop),由框架硬编码,不可配置。config/process/:进程声明发现目录。每个子文件返回[进程名 => ['handler' => ..., 'listen' => ..., 'count' => ...]]结构。框架仅扫描config/process/*.php(目录不存在时跳过)。同名进程冲突会抛出异常,要求显式改名。 子包安装时自动注入其进程配置(如 fiberphp/http 注入config/process/http.php),应用无需手工创建。config/command/:控制台命令发现目录。每个子文件返回命令类class-string[]或[cmdName => class-string];与PackageManifest中#[Package(commands: [])]的结果合并去重。目录按需创建即可(框架扫描时容错,不存在则跳过); 子包的命令优先通过#[Package(commands: [])]自动注册,不依赖该目录。route/(根目录):闭包/数组回调路由文件目录,安装 fiberphp/router 后由其扫描加载;业务路由推荐控制器注解。
常用命令
通过 Makefile 简化操作:
| 命令 | 说明 |
|---|---|
make install | 安装 Composer 依赖 |
make start | 前台启动服务 |
make start-daemon | 以守护进程方式启动 |
make stop | 停止服务 |
make reload | 平滑重启 |
make test | 运行 PHPUnit 测试 |
CLI 入口
安装依赖后,项目根目录会生成可执行入口 fiberphp(由 fiberphp/console 包安装时自动发布,无需手工创建):
./fiberphp # 查看可用命令
./fiberphp status # 查看 Worker 状态
./fiberphp restart # 重启 Worker
./fiberphp stop # 停止 Worker
应用自定义命令可通过 #[Package(commands: [])] 包发现或在 config/command/ 放置注册文件注册。
Provider 开发说明
Provider 是 FiberPHP 的服务提供者,实现 FiberPHP\Contract\ProviderInterface,拥有两阶段生命周期:
namespace App\Provider;
use FiberPHP\Contract\ProviderInterface;
class MyProvider implements ProviderInterface
{
// 1. 注册阶段:仅做容器绑定,不要访问其他服务
public function register(): void
{
// app()->bind(MyService::class, fn() => new MyService());
}
// 2. 启动阶段:可访问已注册服务,执行路由注册、事件监听、探活等
public function boot(?object $worker = null): void
{
// $worker 为 Workerman\Worker 实例(CLI 命令场景可能为 null)
}
// 声明 boot() 调度元数据,供 BootGuard 决定超时保护与异常分类策略
public function bootMeta(): array
{
return [
'critical' => false, // true 时 boot 异常终止 Worker 启动
'network' => false, // 是否可能产生新的网络建连
'timeout' => null, // 网络探活超时秒数;null 显式禁用 alarm
];
}
// 可选:声明 boot 依赖(必须先完成 boot 的 Provider 类名数组)
public static function bootAfter(): array
{
return [];
}
}
bootMeta() 字段说明:
critical(bool,默认 false):核心基础设施标记。true 时 boot 抛出的异常会终止 Worker 启动;false 时降级为 warning 日志并跳过。network(bool,默认 false):boot 是否可能进行网络建连。仅当true且timeout !== null时才启用pcntl_alarm超时保护。timeout(float|int|null):最大允许执行秒数。正数启用 alarm 强制中断;null显式禁用 alarm(适用于复用已有连接或自行处理超时)。
子包(如 fiberphp/http、fiberphp/database)通过 Composer post-autoload-dump 钩子(FiberPHP\Package\PackageInstaller::discover
)自动注册到 PackageManifest,无需手动在应用配置中声明。
异常处理自定义
应用层通过 app/ExceptionHandler.php 自定义异常渲染。该类继承 FiberPHP\Framework\Exception\Handler,框架在 Handler::resolve()
中自动发现 App\ExceptionHandler:
namespace App;
use FiberPHP\Framework\Exception\Handler;
class ExceptionHandler extends Handler
{
// 可覆盖以下方法自定义输出:
// - renderHttp(Throwable $e, mixed $request = null): mixed HTTP 上下文
// - renderConsole(Throwable $e): string 控制台上下文
// - renderRpc(Throwable $e): array RPC 上下文
// - shouldReport(Throwable $e): bool 是否上报(配合 $dontReport)
protected array $dontReport = [
// 不需上报的异常类型
];
}
render() 入口按上下文(http / console / rpc)分发到对应方法,并保证永不抛出。fiberphp/http 包会覆盖 renderHttp()
返回 Response 对象。