Skip to content

💻 平台

检查系统是否满足 PHP 版本与扩展等平台需求,获取运行环境信息。

Composer 的平台(platform)概念指 PHP 本体及其扩展(ext-xxx)、PHP 库(lib-xxx)等运行时依赖。composer.jsonrequire 中以 phpext-*lib-* 形式声明的就是平台需求。Composer Skills 提供两类方法:基于 check-platform 的需求检查,以及直接读取 PHP 运行时信息的便捷查询。

何时使用

  • 💻 部署前检查:目标机器是否满足 composer.json 声明的 PHP 版本与扩展。
  • 🧩 依赖安装前置校验:在 composer install 前判断是否缺失关键扩展,给出可读错误而非让 Composer 报错中断。
  • 🚀 CI 矩阵构建:根据 GetPHPVersion / GetExtensions 动态决定测试矩阵。
  • 🔍 健康检查:作为 HealthCheck 的输入项之一。

结构化返回类型

PlatformInfo

CheckPlatform / CheckPlatformWithLock 返回的单条平台需求信息。

go
type PlatformInfo struct {
    Name      string `json:"name"`
    Version   string `json:"version"`
    Available bool   `json:"available"`
    Required  string `json:"required,omitempty"`
}
字段类型说明
Namestring平台项名称,如 phpext-mbstring
Versionstring当前系统实际版本
Availablebool是否满足/可用
Requiredstring声明的版本约束(可空)

PlatformRequirements

CheckPlatform / CheckPlatformWithLock 内部解析的中间结构。

go
type PlatformRequirements struct {
    Platform map[string]PlatformInfo `json:"platform"`
    Lock     map[string]PlatformInfo `json:"lock,omitempty"`
}
字段类型说明
Platformmap[string]PlatformInfocomposer.json 中声明的平台需求
Lockmap[string]PlatformInfocomposer.lock 中锁定的平台需求(可空)

两个来源

CheckPlatformPlatform 字段(composer.json 的需求),CheckPlatformWithLockLock 字段(lock 文件锁定的需求)。两者都基于 composer check-platform --format=json,区别仅在于 --lock 标志。

PlatformRequirement / PlatformCheckResult

CheckPlatformReqsStructured 返回,对应 composer check-platform-reqs --format=json

go
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"`
}
字段类型说明
Packagestring平台包名
Versionstring实际版本
Statusstring状态:ok/successmissingmismatch
Requiredstring要求的版本约束
Requirements[]PlatformRequirement全部需求项
OKbool是否全部通过(任一项非 ok/success 即为 false

check-platform 与 check-platform-reqs 的区别

  • check-platformCheckPlatform 系列):检查 composer.json/composer.lock 中声明的平台需求是否满足。
  • check-platform-reqsCheckPlatformReqsStructured):检查 Composer 解析后实际需要的平台需求,更接近安装时 Composer 自己做的校验,状态字段更明确(missing/mismatch)。

CheckPlatform

💻 检查当前系统是否满足 composer.json 中定义的平台需求。

签名

go
func (c *Composer) CheckPlatform() ([]PlatformInfo, error)

参数

无。

返回值

类型说明
平台需求[]PlatformInfocomposer.json 中声明的平台需求列表
错误error执行或 JSON 解析失败时返回

等价命令

composer check-platform --format=json

示例

go
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 中锁定的平台需求。

签名

go
func (c *Composer) CheckPlatformWithLock() ([]PlatformInfo, error)

参数

无。

返回值

类型说明
平台需求[]PlatformInfocomposer.lock 中锁定的平台需求列表
错误error执行或 JSON 解析失败时返回

等价命令

composer check-platform --lock --format=json

示例

go
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

💻 检查指定的平台需求是否满足。

签名

go
func (c *Composer) IsPlatformAvailable(platform string, version string) (bool, error)

参数

参数类型说明
platformstring平台名称,例如 phpext-mbstring
versionstring版本约束,例如 >=7.4;可传空字符串表示不约束版本

返回值

类型说明
是否满足booltrue 表示平台可用/满足
错误error检查失败时返回

实现说明

  1. 先调用 CheckPlatform 在已声明需求中查找同名项,命中则返回其 Available
  2. 若未在需求中列出,则构造 platform[:version] 直接执行 composer check-platform <item>,并依据输出是否包含 is not available 判定。

示例

go
// 检查 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 版本号。

签名

go
func (c *Composer) GetPHPVersion() (string, error)

参数

无。

返回值

类型说明
PHP 版本string当前 PHP 版本号;若无法从输出解析则返回空字符串
错误error执行失败时返回

等价命令

composer run --php-show-version

实现说明

执行 composer run --php-show-version,逐行扫描以 PHP 开头的行,取空格分隔的第二个字段作为版本号。

示例

go
phpVersion, err := comp.GetPHPVersion()
if err != nil {
    log.Fatalf("获取 PHP 版本失败: %v", err)
}
fmt.Printf("当前 PHP 版本: %s\n", phpVersion)

GetExtensions

💻 获取当前 PHP 环境中已安装的扩展列表。

签名

go
func (c *Composer) GetExtensions() ([]string, error)

参数

无。

返回值

类型说明
扩展列表[]string已安装扩展名列表;无则为空切片
错误error执行失败时返回

等价命令

composer run --show-extensions

实现说明

执行 composer run --show-extensions,按行解析输出,跳过空行与 Loaded extensions: 标题行。

示例

go
extensions, err := comp.GetExtensions()
if err != nil {
    log.Fatalf("获取 PHP 扩展失败: %v", err)
}
fmt.Println("已安装的 PHP 扩展:")
for _, ext := range extensions {
    fmt.Println("- " + ext)
}

HasExtension

💻 检查是否安装了指定的 PHP 扩展。

签名

go
func (c *Composer) HasExtension(extension string) (bool, error)

参数

参数类型说明
extensionstring要检查的扩展名,例如 mbstringpdo

返回值

类型说明
是否安装booltrue 表示已安装
错误error检查失败时返回

实现说明

内部调用 GetExtensions,在结果中精确匹配扩展名。

示例

go
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 更明确。

go
func (c *Composer) CheckPlatformReqsStructured() (*PlatformCheckResult, error)
类型说明
结果*PlatformCheckResultRequirements 列表与整体 OK
错误error执行或解析失败时返回
go
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

go
func ParsePlatformCheckResult(output string) (*PlatformCheckResult, error)

ParseCheckPlatformReqsOutput

定义在 parsing.go 中的解析函数,把文本输出解析为 []PlatformRequirement,适合非 JSON 场景。

go
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

🔍 相关方法

  • 验证ValidateSchema 等会触发平台相关检查;Prohibit 查看被平台需求禁止的包。
  • 诊断与健康检查HealthCheck 内部调用 installer.HasPHP() / installer.GetPHPVersion() 检查 PHP 环境,结果写入 PHPAvailable / PHPVersion

基于 MIT 许可证发布