2009-08-26 13 views
12

Necesito probar el valor devuelto por ini_get('memory_limit') y aumentar el límite de memoria si está por debajo de un cierto umbral, sin embargo, esta llamada ini_get('memory_limit') devuelve valores de cadena como '128M' en lugar de enteros.¿Hay alguna manera fácil en PHP para convertir cadenas como '256M', '180K', '4G' a sus equivalentes enteros?

sé que puedo escribir una función para analizar estas cadenas (teniendo caso anterior y posterior 'de B en cuenta) como las he escrito en numerosas ocasiones:

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

Sin embargo, esto se vuelve tedioso y esto parece ser una de esas cosas al azar que ya existirían en PHP, aunque nunca lo he encontrado. ¿Alguien sabe de alguna forma incorporada para analizar estas cadenas de cantidad de bytes?

Respuesta

5

creo que estás fuera de suerte. El manual de PHP para ini_get() realmente aborda este problema específico en una advertencia sobre cómo ini_get() devuelve los valores de ini.

que proporcionan una función en uno de los ejemplos para hacer exactamente esto, así que supongo que es el camino a seguir:

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

Tienen que decir acerca de la función anterior: "El ejemplo anterior muestra una forma de convertir la notación abreviada en bytes, muy similar a cómo lo hace la fuente PHP ".

+0

Mismo problema que la respuesta de John: no maneja el seguimiento opcional B. – cletus

+1

Sí, eso es cierto. Lo estaba proporcionando principalmente para ilustrar cómo el manual de PHP afirma que está hecho. Esto funcionaría si solo quisieras analizar los resultados de 'ini_get()', de lo contrario tendrías que modificarlo tú mismo. La respuesta breve a la pregunta de los carteles es realmente "No, no hay un método incorporado". – zombat

+0

Estaba buscando esta información en la descripción de los valores de ini y en casi cualquier otro lugar que no sean los documentos de la función 'ini_get()'. Gracias por encontrar eso. –

2

Desde el sitio web de PHP para 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; 
} 
+0

que en realidad no manejar la opción B en el fin. – cletus

+0

¿Cuándo tiene una B en el extremo? ¿Es esa plataforma específica? –

+0

Mire la expresión regular del OP. Hay una B opcional al final. – cletus

2

sólo puedo pensar en una ligera variación en lo que estás haciendo:

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); 
} 
+1

En realidad me gusta la versión original incluso más que la tuya: sin bucles. Al menos no hay bucles explícitos :) – elcuco

4

O alguna versión más corta, si por favor

function toInteger ($string) 
{ 
    sscanf ($string, '%u%c', $number, $suffix); 
    if (isset ($suffix)) 
    { 
     $number = $number * pow (1024, strpos (' KMG', strtoupper($suffix))); 
    } 
    return $number; 
} 
Cuestiones relacionadas