如何编写一个 Composer 脚本来检查项目的 PHP 版本和扩展是否满足要求?

12次阅读

可在 composer.json 的 “scripts” 段定义自定义脚本,用 php 内置函数检查环境;轻量、无需额外依赖,可随 composer install 或手动触发运行。

如何编写一个 Composer 脚本来检查项目的 PHP 版本和扩展是否满足要求?

可以在 composer.json"scripts" 段中定义一个自定义脚本,利用 PHP 内置函数检查当前环境是否满足项目要求。这种方式轻量、无需额外依赖,且能随 composer install 或手动触发运行。

composer.json 中定义检查脚本

将以下内容添加到项目的 composer.json 文件的 "scripts" 区块中:

"scripts": {   "check-env": [     "@php -r "if (version_compare(PHP_VERSION, '8.1.0', '<')) { echo "\n❌ PHP 版本过低:当前是 " . PHP_VERSION . ",需至少 8.1.0\n"; exit(1); } else { echo '\n✅ PHP 版本 OK:' . PHP_VERSION . "\n"; }"",     "@php -r "if (!extension_loaded('mbstring')) { echo "\n❌ 缺少扩展:mbstring 未启用\n"; exit(1); } else { echo '✅ 扩展 OK:mbstring\n'; }"",     "@php -r "if (!extension_loaded('curl')) { echo "\n❌ 缺少扩展:curl 未启用\n"; exit(1); } else { echo '✅ 扩展 OK:curl\n'; }""   ] }

你可以按需增减检查项,比如加 jsonopensslpdo_mysql 等。

支持更灵活的检查逻辑(推荐)

把检查逻辑抽成独立 PHP 脚本(如 bin/check-env.php),更易维护和测试:

立即学习PHP免费学习笔记(深入)”;

  • 创建 bin/check-env.php,内容类似:

= {$requiredPhpVersion}n");     exit(1); } 

$requiredExtensions = ['mbstring', 'curl', 'json', 'openssl']; foreach ($requiredExtensions as $ext) { if (!extension_loaded($ext)) { fwrite(STDERR, "❌ 缺少扩展:{$ext}n"); exit(1); } } echo "✅ 环境检查通过n";

  • composer.json 中调用它:

"scripts": {   "check-env": "php bin/check-env.php" }

自动在安装/更新时运行检查

利用 Composer 的事件钩子,让检查在关键流程中自动触发:

  • 添加到 "scripts" 的事件监听中:

"scripts": {   "check-env": "php bin/check-env.php",   "post-install-cmd": "@check-env",   "post-update-cmd": "@check-env" }

这样每次执行 composer installcomposer update 后都会自动校验。如果失败,命令会中断并报错,避免在不兼容环境中继续操作。

增强体验的小技巧

让检查更友好、可调试:

  • 输出当前 PHP 二进制路径:echo '? PHP 路径:' . PHP_BINARY . "n";
  • 检查扩展版本(如需要):phpversion('curl')
  • 跳过检查(开发调试时):composer run check-env -- --no-check(需在脚本中解析参数)
  • 结合 composer.json"config.platform" 做语义化提示(非强制,仅提示)

基本上就这些。不复杂但容易忽略——关键是把检查变成自动化环节,而不是靠人肉记文档。

text=ZqhQzanResources