必须在 PHP 配置文件(php.ini)中启用 register_argc_argv 选项。该设置会将命令行参数和查询参数加载到 $_SERVER['argv'] 中。 https://www.php.net/manual/en/ini.core.php#ini.register-argc-argv
以下 Symfony 代码使用输入参数(ArgvInput)来确定某些环境变量的值,特别是 APP_ENV 和 APP_DEBUG。以下是 Symfony 代码的相关部分:
//Symfony\Component\Runtime\SymfonyRuntime
$input = new ArgvInput();
if (isset($this->options['env'])) {
return $this->input = $input;
}
if (null !== $env = $input->getParameterOption(['--env', '-e'], null, true)) {
putenv($this->options['env_var_name'].'='.$_SERVER[$this->options['env_var_name']] = $_ENV[$this->options['env_var_name']] = $env);
}
if ($input->hasParameterOption('--no-debug', true)) {
putenv($this->options['debug_var_name'].'='.$_SERVER[$this->options['debug_var_name']] = $_ENV[$this->options['debug_var_name']] = '0');
}
上述代码处理通过 ArgvInput 提供的参数。如果在 argv 中指定了 --env 参数,它会相应地更新环境变量 APP_ENV。类似地,如果存在 --no-debug,它会将 APP_DEBUG 设置为 0。
ArgvInput 类初始化通过命令行、查询参数传递的 argv 参数,或者默认情况下初始化 $_SERVER['argv'] 中的参数。array_shift($argv); 函数会移除 $argv 数组中的第一个元素(通常是应用程序名称),并将剩余参数存储在 $this->tokens 中。
//Symfony\Component\Console\Input\ArgvInput
public function __construct(?array $argv = null, ?InputDefinition $definition = null)
{
$argv ??= $_SERVER['argv'] ?? [];
// strip the application name
array_shift($argv);
$this->tokens = $argv;
parent::__construct($definition);
}
使用以下 URL:http://localhost/?+--env=dev,我们可以将 --env=dev 参数注入到 $_SERVER['argv'] 中。这允许我们无需直接修改应用程序配置即可将 APP_ENV 值更改为 dev。
$_SERVER['argv'] = ["+--env=dev"];
$argv = ["--env=dev"];