2009-08-26 7 views
12

Devo verificare il valore restituito da ini_get('memory_limit') e aumentare il limite di memoria se è inferiore a una determinata soglia, tuttavia questa chiamata ini_get('memory_limit') restituisce valori stringa come "128M" anziché numeri interi.C'è un modo semplice in PHP per convertire da stringhe come '256M', '180K', '4G' ai loro interi interi?

So che posso scrivere una funzione per analizzare queste stringhe (prendendo caso e finali 'B in considerazione) come ho scritto numerose volte:

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

Tuttavia, questo diventa noioso e questo mi sembra uno di quelle cose casuali che esisterebbero già in PHP, anche se non l'ho mai trovato. Qualcuno sa di un modo integrato per analizzare queste stringhe di quantità di byte?

risposta

5

Penso che tu sia fuori di fortuna. Il manuale PHP per ini_get() in realtà affronta questo problema specifico in un avviso su come ini_get() restituisce i valori ini.

forniscono una funzione in uno degli esempi di fare esattamente questo, quindi sto cercando di indovinare che è la strada da percorrere:

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

Hanno questo da dire circa la funzione di cui sopra: "L'esempio di cui sopra mostra un modo per convertire la notazione abbreviata in byte, proprio come fa la fonte PHP. "

+0

Lo stesso problema della risposta di John: non gestisce il trailing opzionale B. – cletus

+1

Sì, è vero. Lo stavo fornendo principalmente per illustrare come il manuale PHP afferma che è fatto. Questo funzionerebbe se volessi analizzare solo i risultati di 'ini_get()', altrimenti dovresti modificarlo da solo. La risposta breve alla domanda dei posters è "No, non esiste un metodo integrato". – zombat

+0

Stavo cercando queste informazioni nella descrizione dei valori ini e in qualsiasi altro luogo oltre ai documenti per la funzione 'ini_get()'. Grazie per averlo trovato. –

2

Dal sito web di PHP per 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

che in realtà non gestisce opzionale B su fine. – cletus

+0

Quando ha una B alla fine? Questa piattaforma è specifica? –

+0

Osserva la regex dell'OP. C'è una B opzionale alla fine. – cletus

2

posso solo pensare a una leggera variazione su quello che stai facendo:

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

In realtà mi piace la versione originale ancora più della tua: nessun loop. Almeno nessun loop esplicito :) – elcuco

4

O qualche versione più breve, se vi piace

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