Skip to content

Commit bc1b351

Browse files
committed
allow usage of env vars in php ini size settings
1 parent fc5f0a6 commit bc1b351

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

src/Io/IniUtil.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,14 @@ public static function iniSizeToBytes($size)
1919
return (int)$size;
2020
}
2121

22+
// ini size values might be specified via environment variables, e.g.: memory_limit=${PHP_MEMORY_LIMIT}
23+
$matches = [];
24+
$envVarUsed = preg_match('#^\$(?|(\w+)|\{(\w+)})$#', $size, $matches);
25+
$envVarName = $matches[1] ?? false;
26+
if ($envVarUsed && $envVarName && array_key_exists($envVarName, $_ENV)) {
27+
$size = (string)$_ENV[$envVarName];
28+
}
29+
2230
$suffix = \strtoupper(\substr($size, -1));
2331
$strippedSize = \substr($size, 0, -1);
2432

tests/Io/IniUtilTest.php

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,48 @@ public function testInvalidInputIniSizeToBytes($input)
7474
$this->expectException(\InvalidArgumentException::class);
7575
IniUtil::iniSizeToBytes($input);
7676
}
77+
78+
public function testIniSizeViaEnvVariableWorks()
79+
{
80+
self::assertArrayNotHasKey('INIUTIL_ENV_VAR_WITH_PHP_SIZE_VALUE', $_ENV);
81+
$_ENV['INIUTIL_ENV_VAR_WITH_PHP_SIZE_VALUE'] = '23M';
82+
$this->assertSame(23 * 1024 * 1024, IniUtil::iniSizeToBytes('${INIUTIL_ENV_VAR_WITH_PHP_SIZE_VALUE}'));
83+
}
84+
85+
public function testIniSizeViaSimpleEnvVariableWorks()
86+
{
87+
self::assertArrayNotHasKey('INIUTIL_SIMPLE_ENV_VAR_WITH_PHP_SIZE_VALUE', $_ENV);
88+
$_ENV['INIUTIL_SIMPLE_ENV_VAR_WITH_PHP_SIZE_VALUE'] = '42M';
89+
$this->assertSame(42 * 1024 * 1024, IniUtil::iniSizeToBytes('$INIUTIL_SIMPLE_ENV_VAR_WITH_PHP_SIZE_VALUE'));
90+
}
91+
92+
public function testIniSizeViaEnvVariableFailsForNonSizeValue()
93+
{
94+
self::assertArrayNotHasKey('INIUTIL_ENV_VAR_WITHOUT_PHP_SIZE_VALUE', $_ENV);
95+
$_ENV['INIUTIL_ENV_VAR_WITHOUT_PHP_SIZE_VALUE'] = 'no-size';
96+
$this->expectException(\InvalidArgumentException::class);
97+
IniUtil::iniSizeToBytes('${INIUTIL_ENV_VAR_WITHOUT_PHP_SIZE_VALUE}');
98+
}
99+
100+
public function testIniSizeViaEnvVariableIgnoresInvalidSizeModifier()
101+
{
102+
self::assertArrayNotHasKey('INIUTIL_ENV_VAR_WITH_PHP_SIZE_VALUE_AND_INVALID_MODIFIER', $_ENV);
103+
$_ENV['INIUTIL_ENV_VAR_WITH_PHP_SIZE_VALUE_AND_INVALID_MODIFIER'] = '1337V';
104+
$this->assertSame(1337, IniUtil::iniSizeToBytes('${INIUTIL_ENV_VAR_WITH_PHP_SIZE_VALUE_AND_INVALID_MODIFIER}'));
105+
}
106+
107+
public function testIniSizeViaEnvVariableFailsForNonNumericValue()
108+
{
109+
self::assertArrayNotHasKey('INIUTIL_ENV_VAR_WITH_NON_NUMERIC_PHP_SIZE_VALUE', $_ENV);
110+
$_ENV['INIUTIL_ENV_VAR_WITH_NON_NUMERIC_PHP_SIZE_VALUE'] = 'V1337V';
111+
$this->expectException(\InvalidArgumentException::class);
112+
IniUtil::iniSizeToBytes('${INIUTIL_ENV_VAR_WITH_NON_NUMERIC_PHP_SIZE_VALUE}');
113+
}
114+
115+
public function testIniSizeViaMissingEnvVariableFails()
116+
{
117+
self::assertArrayNotHasKey('INIUTIL_ENV_VAR_MISSING_WITH_NON_NUMERIC_PHP_SIZE_VALUE', $_ENV);
118+
$this->expectException(\InvalidArgumentException::class);
119+
IniUtil::iniSizeToBytes('${INIUTIL_ENV_VAR_MISSING_WITH_NON_NUMERIC_PHP_SIZE_VALUE}');
120+
}
77121
}

0 commit comments

Comments
 (0)