💻 平台
检查系统是否满足 PHP 版本与扩展等平台需求,获取运行环境信息。
Composer 的平台(platform)概念指 PHP 本体及其扩展(ext-xxx)、PHP 库(lib-xxx)等运行时依赖。composer.json 的 require 中以 php、ext-*、lib-* 形式声明的就是平台需求。Composer Skills 提供两类方法:基于 check-platform 的需求检查,以及直接读取 PHP 运行时信息的便捷查询。
何时使用
- 💻 部署前检查:目标机器是否满足
composer.json声明的 PHP 版本与扩展。 - 🧩 依赖安装前置校验:在
composer install前判断是否缺失关键扩展,给出可读错误而非让 Composer 报错中断。 - 🚀 CI 矩阵构建:根据
GetPHPVersion/GetExtensions动态决定测试矩阵。 - 🔍 健康检查:作为
HealthCheck的输入项之一。
结构化返回类型
PlatformInfo
CheckPlatform / CheckPlatformWithLock 返回的单条平台需求信息。
type PlatformInfo struct {
Name string `json:"name"`
Version string `json:"version"`
Available bool `json:"available"`
Required string `json:"required,omitempty"`
}| 字段 | 类型 | 说明 |
|---|---|---|
Name | string | 平台项名称,如 php、ext-mbstring |
Version | string | 当前系统实际版本 |
Available | bool | 是否满足/可用 |
Required | string | 声明的版本约束(可空) |
PlatformRequirements
CheckPlatform / CheckPlatformWithLock 内部解析的中间结构。
type PlatformRequirements struct {
Platform map[string]PlatformInfo `json:"platform"`
Lock map[string]PlatformInfo `json:"lock,omitempty"`
}| 字段 | 类型 | 说明 |
|---|---|---|
Platform | map[string]PlatformInfo | composer.json 中声明的平台需求 |
Lock | map[string]PlatformInfo | composer.lock 中锁定的平台需求(可空) |
两个来源
CheckPlatform 取 Platform 字段(composer.json 的需求),CheckPlatformWithLock 取 Lock 字段(lock 文件锁定的需求)。两者都基于 composer check-platform --format=json,区别仅在于 --lock 标志。
PlatformRequirement / PlatformCheckResult
CheckPlatformReqsStructured 返回,对应 composer check-platform-reqs --format=json。
type PlatformRequirement struct {
Package string `json:"package"`
Version string `json:"version,omitempty"`
Status string `json:"status"` // "ok", "missing", "mismatch"
Required string `json:"required,omitempty"`
}
type PlatformCheckResult struct {
Requirements []PlatformRequirement `json:"requirements"`
OK bool `json:"ok"`
}| 字段 | 类型 | 说明 |
|---|---|---|
Package | string | 平台包名 |
Version | string | 实际版本 |
Status | string | 状态:ok/success、missing、mismatch |
Required | string | 要求的版本约束 |
Requirements | []PlatformRequirement | 全部需求项 |
OK | bool | 是否全部通过(任一项非 ok/success 即为 false) |
check-platform 与 check-platform-reqs 的区别
check-platform(CheckPlatform系列):检查composer.json/composer.lock中声明的平台需求是否满足。check-platform-reqs(CheckPlatformReqsStructured):检查 Composer 解析后实际需要的平台需求,更接近安装时 Composer 自己做的校验,状态字段更明确(missing/mismatch)。
CheckPlatform
💻 检查当前系统是否满足 composer.json 中定义的平台需求。
签名
func (c *Composer) CheckPlatform() ([]PlatformInfo, error)参数
无。
返回值
| 值 | 类型 | 说明 |
|---|---|---|
| 平台需求 | []PlatformInfo | composer.json 中声明的平台需求列表 |
| 错误 | error | 执行或 JSON 解析失败时返回 |
等价命令
composer check-platform --format=json
示例
platforms, err := comp.CheckPlatform()
if err != nil {
log.Fatalf("检查平台需求失败: %v", err)
}
for _, platform := range platforms {
status := "不满足"
if platform.Available {
status = "满足"
}
fmt.Printf("%s %s: %s\n", platform.Name, platform.Version, status)
}CheckPlatformWithLock
💻 检查当前系统是否满足 composer.lock 中锁定的平台需求。
签名
func (c *Composer) CheckPlatformWithLock() ([]PlatformInfo, error)参数
无。
返回值
| 值 | 类型 | 说明 |
|---|---|---|
| 平台需求 | []PlatformInfo | composer.lock 中锁定的平台需求列表 |
| 错误 | error | 执行或 JSON 解析失败时返回 |
等价命令
composer check-platform --lock --format=json
示例
platforms, err := comp.CheckPlatformWithLock()
if err != nil {
log.Fatalf("检查 lock 文件平台需求失败: %v", err)
}
for _, platform := range platforms {
if !platform.Available {
fmt.Printf("警告: %s %s 需求不满足\n", platform.Name, platform.Required)
}
}选用哪个
部署到生产环境时,实际安装的是 lock 文件锁定的版本,用 CheckPlatformWithLock 更贴近真实。开发阶段或还未生成 lock 文件时用 CheckPlatform。
IsPlatformAvailable
💻 检查指定的平台需求是否满足。
签名
func (c *Composer) IsPlatformAvailable(platform string, version string) (bool, error)参数
| 参数 | 类型 | 说明 |
|---|---|---|
platform | string | 平台名称,例如 php 或 ext-mbstring |
version | string | 版本约束,例如 >=7.4;可传空字符串表示不约束版本 |
返回值
| 值 | 类型 | 说明 |
|---|---|---|
| 是否满足 | bool | true 表示平台可用/满足 |
| 错误 | error | 检查失败时返回 |
实现说明
- 先调用
CheckPlatform在已声明需求中查找同名项,命中则返回其Available。 - 若未在需求中列出,则构造
platform[:version]直接执行composer check-platform <item>,并依据输出是否包含is not available判定。
示例
// 检查 PHP 版本
available, err := comp.IsPlatformAvailable("php", ">=7.4")
if err != nil {
log.Fatalf("检查 PHP 版本失败: %v", err)
}
if available {
fmt.Println("PHP 版本满足需求")
} else {
fmt.Println("PHP 版本不满足需求")
}
// 检查扩展
available, err = comp.IsPlatformAvailable("ext-mbstring", "")
if err != nil {
log.Fatalf("检查扩展失败: %v", err)
}
if available {
fmt.Println("mbstring 扩展已安装")
} else {
fmt.Println("mbstring 扩展未安装")
}GetPHPVersion
💻 获取当前系统使用的 PHP 版本号。
签名
func (c *Composer) GetPHPVersion() (string, error)参数
无。
返回值
| 值 | 类型 | 说明 |
|---|---|---|
| PHP 版本 | string | 当前 PHP 版本号;若无法从输出解析则返回空字符串 |
| 错误 | error | 执行失败时返回 |
等价命令
composer run --php-show-version
实现说明
执行 composer run --php-show-version,逐行扫描以 PHP 开头的行,取空格分隔的第二个字段作为版本号。
示例
phpVersion, err := comp.GetPHPVersion()
if err != nil {
log.Fatalf("获取 PHP 版本失败: %v", err)
}
fmt.Printf("当前 PHP 版本: %s\n", phpVersion)GetExtensions
💻 获取当前 PHP 环境中已安装的扩展列表。
签名
func (c *Composer) GetExtensions() ([]string, error)参数
无。
返回值
| 值 | 类型 | 说明 |
|---|---|---|
| 扩展列表 | []string | 已安装扩展名列表;无则为空切片 |
| 错误 | error | 执行失败时返回 |
等价命令
composer run --show-extensions
实现说明
执行 composer run --show-extensions,按行解析输出,跳过空行与 Loaded extensions: 标题行。
示例
extensions, err := comp.GetExtensions()
if err != nil {
log.Fatalf("获取 PHP 扩展失败: %v", err)
}
fmt.Println("已安装的 PHP 扩展:")
for _, ext := range extensions {
fmt.Println("- " + ext)
}HasExtension
💻 检查是否安装了指定的 PHP 扩展。
签名
func (c *Composer) HasExtension(extension string) (bool, error)参数
| 参数 | 类型 | 说明 |
|---|---|---|
extension | string | 要检查的扩展名,例如 mbstring 或 pdo |
返回值
| 值 | 类型 | 说明 |
|---|---|---|
| 是否安装 | bool | true 表示已安装 |
| 错误 | error | 检查失败时返回 |
实现说明
内部调用 GetExtensions,在结果中精确匹配扩展名。
示例
hasJson, err := comp.HasExtension("json")
if err != nil {
log.Fatalf("检查扩展失败: %v", err)
}
if hasJson {
fmt.Println("JSON 扩展已安装")
} else {
fmt.Println("JSON 扩展未安装")
}进阶
CheckPlatformReqsStructured
结构化的 check-platform-reqs,返回 *PlatformCheckResult,状态字段比 CheckPlatform 更明确。
func (c *Composer) CheckPlatformReqsStructured() (*PlatformCheckResult, error)| 值 | 类型 | 说明 |
|---|---|---|
| 结果 | *PlatformCheckResult | 含 Requirements 列表与整体 OK |
| 错误 | error | 执行或解析失败时返回 |
result, err := comp.CheckPlatformReqsStructured()
if err != nil {
log.Fatalf("平台需求检查失败: %v", err)
}
if !result.OK {
for _, req := range result.Requirements {
if req.Status != "ok" && req.Status != "success" {
fmt.Printf("不满足: %s (要求 %s, 实际 %s, 状态 %s)\n",
req.Package, req.Required, req.Version, req.Status)
}
}
}ParsePlatformCheckResult
纯函数,把任意 composer check-platform-reqs --format=json 输出解析为 *PlatformCheckResult。
func ParsePlatformCheckResult(output string) (*PlatformCheckResult, error)ParseCheckPlatformReqsOutput
定义在 parsing.go 中的解析函数,把文本输出解析为 []PlatformRequirement,适合非 JSON 场景。
func ParseCheckPlatformReqsOutput(output string) ([]PlatformRequirement, error)CheckPlatformReqsWithFormat / CheckPlatformReqs / CheckPlatformReqsLock
| 方法 | 等价命令 | 说明 |
|---|---|---|
CheckPlatformReqs() (string, error) | check-platform-reqs | 文本输出(定义于 config.go) |
CheckPlatformReqsLock() (string, error) | check-platform-reqs --lock | 检查 lock 文件平台需求 |
CheckPlatformReqsWithFormat(format string) (string, error) | check-platform-reqs --format=FORMAT | 指定格式输出(定义于 additional_methods.go) |