composer脚本中无法读取$_env或getenv()是因为php进程未继承shell环境变量;解决方法为显式注入环境变量或改用支持透传的执行方式,如linux/macos用env var=xxx php script.php、windows用set var=xxx ^&^& php script.php,或在composer.json中使用${var}占位符并配合运行时校验。

Composer脚本里直接读不到 $_ENV 或 getenv()?
因为 Composer 执行脚本时默认不加载 shell 环境变量,尤其是通过 composer install 或 composer run-script 触发的 PHP 脚本,$_ENV 为空、getenv('FOO') 返回 false 是常态——这不是你漏配了 .env,而是 PHP 进程根本没继承父 shell 的环境。
解决方法只有两个方向:显式注入,或改用支持环境透传的执行方式。
- 在
composer.json的scripts中用env VAR=xxx php script.php方式前置注入(Linux/macOS 有效) - Windows 用户需改用
set VAR=xxx && php script.php,但注意&&在 Composer 中需转义为^&^& - 更可靠的做法:把变量写进
php -d variables_order=EGPCS启动参数,但仅影响$_SERVER,不改变getenv()
composer.json 中如何安全传递敏感变量?
别把密钥、token 直接写死在 scripts 字段里——这会进 Git、暴露在 CI 日志中。正确做法是依赖外部注入,并加运行时校验:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 用
${MY_API_KEY}占位符(Composer 2.2+ 支持),它会在执行前自动替换为同名环境变量值 - 脚本内必须检查
getenv('MY_API_KEY') !== false,不能只判空字符串,因为变量可能被设为空 - CI 场景下,优先通过平台机制注入(如 GitHub Actions 的
env:块、GitLab CI 的variables:),而非export命令 - 本地开发可配合
dotenv库,但注意:Composer 不自动加载.env,需在脚本开头手动Dotenv\Dotenv::createImmutable(__DIR__)->load();
PHP 脚本里读取环境变量的兼容写法
不同 PHP SAPI 和 Composer 版本对环境变量的支持不一致,推荐统一用这个组合判断:
// 兼容写法:优先 getenv(),fallback 到 $_SERVER,最后兜底 false
$host = getenv('DB_HOST') ?: $_SERVER['DB_HOST'] ?? 'localhost';
$port = (int)(getenv('DB_PORT') ?: $_SERVER['DB_PORT'] ?? '3306');
-
getenv()在 CLI 模式下默认可用,但若variables_order中不含E(如某些 Docker 镜像精简版 PHP),就会失效 -
$_SERVER总是可用,且 Composer 会把环境变量自动塞进去(只要不是被unset过) - 避免用
$_ENV:它默认关闭,且需额外配置variables_order="EGPCS" - 数值型变量务必强制类型转换,比如端口号不用
(int)容易引发 PDO 连接失败
为什么 composer run-script 有时能读到变量,有时不能?
关键看调用链是否经过 shell 层。例如:
-
composer run-script post-install-cmd→ 直接调用 PHP,不走 shell → 环境变量丢失 -
composer run-script deploy --script=sh -c "echo $API_TOKEN"→ 经过 shell 解析 → 变量被提前展开(有安全风险!) -
"scripts": {"dev": "env APP_ENV=local php serve.php"}→ 显式启动新进程并注入 → 可靠
最易忽略的一点:Docker 容器内运行 Composer 时,宿主机的 export 对容器内进程完全无效,必须用 docker run -e VAR=xxx 或 environment: 显式传递。










