Мне нужно проверить значение, возвращаемое ini_get('memory_limit')
и увеличить предел памяти, если он ниже определенного порога, однако этот ini_get('memory_limit')
возвращает строковые значения, такие как «128M», а не целые.
Я знаю, что могу написать функцию для синтаксического анализа этих строк (учитывая случай и учитывать «В»), поскольку я написал их много раз:
function int_from_bytestring ($byteString) { preg_match('/^\s*([0-9.]+)\s*([KMGTPE])B?\s*$/i', $byteString, $matches); $num = (float)$matches[1]; switch (strtoupper($matches[2])) { case 'E': $num = $num * 1024; case 'P': $num = $num * 1024; case 'T': $num = $num * 1024; case 'G': $num = $num * 1024; case 'M': $num = $num * 1024; case 'K': $num = $num * 1024; } return intval($num); }
Тем не менее, это становится утомительным, и это похоже на одну из тех случайных вещей, которые уже существуют в PHP, хотя я ее так и не нашел. Кто-нибудь знает какой-то встроенный способ анализа этих строк байтов?
Я думаю, тебе не повезло. Руководство PHP для ini_get () действительно решает эту проблему в предупреждении о том, как ini_get () возвращает значения ini.
Они обеспечивают функцию в одном из примеров, чтобы сделать именно это, поэтому я предполагаю, что это путь:
function return_bytes($val) { $val = trim($val); $last = strtolower($val[strlen($val)-1]); switch($last) { // The 'G' modifier is available since PHP 5.1.0 case 'g': $val *= 1024; case 'm': $val *= 1024; case 'k': $val *= 1024; } return $val; }
У них есть это, чтобы сказать о вышеупомянутой функции: «В приведенном выше примере показан один способ преобразования сокращенной нотации в байты, как это делает PHP-источник».
Или немного более короткую версию, если хотите
function toInteger ($string) { sscanf ($string, '%u%c', $number, $suffix); if (isset ($suffix)) { $number = $number * pow (1024, strpos (' KMG', strtoupper($suffix))); } return $number; }
На веб-сайте PHP для ini_get()
:
function return_bytes($val) { $val = trim($val); $last = strtolower($val[strlen($val)-1]); switch($last) { // The 'G' modifier is available since PHP 5.1.0 case 'g': $val *= 1024; case 'm': $val *= 1024; case 'k': $val *= 1024; } return $val; }
Я могу только думать о небольшом изменении того, что вы делаете:
function int_from_bytestring($byteString) { $ret = 0; if (preg_match('!^\s*(\d+(?:\.\d+))\s*([KMNGTPE])B?\s*$!', $byteString, $matches)) { $suffix = " KMGTPE"; $index = strpos($suffix, $matches[2]); if ($index !== false) { $ret = $matches[1]; while ($index--) { $matches *= 1024; } } } return intval($ret); }