diff --git a/src/Io/IniUtil.php b/src/Io/IniUtil.php index 612aae29..a183b217 100644 --- a/src/Io/IniUtil.php +++ b/src/Io/IniUtil.php @@ -19,6 +19,14 @@ public static function iniSizeToBytes($size) return (int)$size; } + // ini size values might be specified via environment variables, e.g.: memory_limit=${PHP_MEMORY_LIMIT} + $matches = []; + $envVarUsed = preg_match('#^\$(?|(\w+)|\{(\w+)})$#', $size, $matches); + $envVarName = $matches[1] ?? false; + if ($envVarUsed && $envVarName && array_key_exists($envVarName, $_ENV)) { + $size = (string)$_ENV[$envVarName]; + } + $suffix = \strtoupper(\substr($size, -1)); $strippedSize = \substr($size, 0, -1); diff --git a/tests/Io/IniUtilTest.php b/tests/Io/IniUtilTest.php index 2e9f99c9..06f5ba97 100644 --- a/tests/Io/IniUtilTest.php +++ b/tests/Io/IniUtilTest.php @@ -74,4 +74,48 @@ public function testInvalidInputIniSizeToBytes($input) $this->expectException(\InvalidArgumentException::class); IniUtil::iniSizeToBytes($input); } + + public function testIniSizeViaEnvVariableWorks() + { + self::assertArrayNotHasKey('INIUTIL_ENV_VAR_WITH_PHP_SIZE_VALUE', $_ENV); + $_ENV['INIUTIL_ENV_VAR_WITH_PHP_SIZE_VALUE'] = '23M'; + $this->assertSame(23 * 1024 * 1024, IniUtil::iniSizeToBytes('${INIUTIL_ENV_VAR_WITH_PHP_SIZE_VALUE}')); + } + + public function testIniSizeViaSimpleEnvVariableWorks() + { + self::assertArrayNotHasKey('INIUTIL_SIMPLE_ENV_VAR_WITH_PHP_SIZE_VALUE', $_ENV); + $_ENV['INIUTIL_SIMPLE_ENV_VAR_WITH_PHP_SIZE_VALUE'] = '42M'; + $this->assertSame(42 * 1024 * 1024, IniUtil::iniSizeToBytes('$INIUTIL_SIMPLE_ENV_VAR_WITH_PHP_SIZE_VALUE')); + } + + public function testIniSizeViaEnvVariableFailsForNonSizeValue() + { + self::assertArrayNotHasKey('INIUTIL_ENV_VAR_WITHOUT_PHP_SIZE_VALUE', $_ENV); + $_ENV['INIUTIL_ENV_VAR_WITHOUT_PHP_SIZE_VALUE'] = 'no-size'; + $this->expectException(\InvalidArgumentException::class); + IniUtil::iniSizeToBytes('${INIUTIL_ENV_VAR_WITHOUT_PHP_SIZE_VALUE}'); + } + + public function testIniSizeViaEnvVariableIgnoresInvalidSizeModifier() + { + self::assertArrayNotHasKey('INIUTIL_ENV_VAR_WITH_PHP_SIZE_VALUE_AND_INVALID_MODIFIER', $_ENV); + $_ENV['INIUTIL_ENV_VAR_WITH_PHP_SIZE_VALUE_AND_INVALID_MODIFIER'] = '1337V'; + $this->assertSame(1337, IniUtil::iniSizeToBytes('${INIUTIL_ENV_VAR_WITH_PHP_SIZE_VALUE_AND_INVALID_MODIFIER}')); + } + + public function testIniSizeViaEnvVariableFailsForNonNumericValue() + { + self::assertArrayNotHasKey('INIUTIL_ENV_VAR_WITH_NON_NUMERIC_PHP_SIZE_VALUE', $_ENV); + $_ENV['INIUTIL_ENV_VAR_WITH_NON_NUMERIC_PHP_SIZE_VALUE'] = 'V1337V'; + $this->expectException(\InvalidArgumentException::class); + IniUtil::iniSizeToBytes('${INIUTIL_ENV_VAR_WITH_NON_NUMERIC_PHP_SIZE_VALUE}'); + } + + public function testIniSizeViaMissingEnvVariableFails() + { + self::assertArrayNotHasKey('INIUTIL_ENV_VAR_MISSING_WITH_NON_NUMERIC_PHP_SIZE_VALUE', $_ENV); + $this->expectException(\InvalidArgumentException::class); + IniUtil::iniSizeToBytes('${INIUTIL_ENV_VAR_MISSING_WITH_NON_NUMERIC_PHP_SIZE_VALUE}'); + } }