получить значение байта из сокращенной записи байтов в php.ini - PullRequest
14 голосов
/ 27 июля 2011

Есть ли способ получить байтовые значения из строк, возвращаемых функциями, такими как ini_get('upload_max_filesize') и ini_get('post_max_size'), когда они используют сокращенную байтовую нотацию ? Например взять 4194304 от 4М? Я мог бы взломать функцию, которая делает это, но я был бы удивлен, если бы не было встроенного способа сделать это.

Ответы [ 5 ]

25 голосов
/ 27 июля 2011

Абзац, который вы связали с , заканчивается:

Вы не можете использовать эти сокращенные обозначения вне php.ini, вместо этого используйте целочисленное значение байтов. См. в документации ini_get () для примера того, как преобразовать эти значения.

Это приводит вас к чему-то вроде этого (которое я немного изменил)):

function return_bytes($val)
{
    $val  = trim($val);

    if (is_numeric($val))
        return $val;

    $last = strtolower($val[strlen($val)-1]);
    $val  = substr($val, 0, -1); // necessary since PHP 7.1; otherwise optional

    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;
}

Используйте его примерно так :

echo return_bytes("3M");
// Output: 3145728

Нет встроенной функции для выполнения этой задачи;Напомним, что настройки INI действительно предназначены для использования внутри в PHP.Исходный код PHP использует функцию, аналогичную приведенной выше.

2 голосов
/ 27 июля 2011

Г! Только что нашел ответ на http://www.php.net/manual/en/function.ini-get.php

Просто нужно RTM ...

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;
}
0 голосов
/ 14 марта 2019

Ни одна из версий, показанных выше, больше не будет работать с PHP 7.2x, как я узнал. При использовании этого с PHP 7.0 + 7.1 он работает, но не с PHP 7.x Эрни

private function return_bytes ($val) {
        if(empty($val))return 0;
        $val = trim($val);
        preg_match('#([0-9]+)[\s]*([a-z]+)#i', $val, $matches);
        $last = '';
        if(isset($matches[2])){
            $last = $matches[2];
        }
        if(isset($matches[1])){
            $val = (int) $matches[1];
        }
        switch (strtolower($last)){
            case 'g':
            case 'gb':  
            $val *= 1024;
            case 'm':
            case 'mb':
            $val *= 1024;
            case 'k':
            case 'kb':
            $val *= 1024;
        }
        return (int) $val;
    }
0 голосов
/ 26 июня 2017

Я нашел много решений для решения этой проблемы, и должна была быть встроенная функция для решения этой проблемы. В любом случае, две вещи, чтобы выделить об этой проблеме:

  1. Это очень специфично для сокращенных байтовых значений PHP, как описано здесь: http://php.net/manual/en/faq.using.php#faq.using.shorthandbytes и должно использоваться только в этом контексте.
  2. Большинство современных IDE выдают предупреждение для switch операторов без break.

Вот решение, которое охватывает все:

/**
 * Convert PHP's directive values to bytes (including the shorthand syntax).
 *
 * @param string $directive The PHP directive from which to get the value from.
 *
 * @return false|int Returns the value of the directive in bytes if available, otherwise false.
 */
function php_directive_value_to_bytes($directive) {
    $value = ini_get($directive);

    // Value must be a string.
    if (!is_string($value)) {
        return false;
    }

    preg_match('/^(?<value>\d+)(?<option>[K|M|G]*)$/i', $value, $matches);

    $value = (int) $matches['value'];
    $option = strtoupper($matches['option']);

    if ($option) {
        if ($option === 'K') {
            $value *= 1024;
        } elseif ($option === 'M') {
            $value *= 1024 * 1024;
        } elseif ($option === 'G') {
            $value *= 1024 * 1024 * 1024;
        }
    }

    return $value;
}
0 голосов
/ 27 июля 2011

Вот один из способов.

$str=ini_get('upload_max_filesize');
preg_match('/[0-9]+/', $str, $match);

echo ($match[0] * 1024 * 1024); // <--This is MB converted to bytes
...