unlimited reported recommended memory_limit htaccess allocate php memory-limit

reported - php time limit



revisando memory_limit en PHP (7)

Necesito verificar si memory_limit es de al menos 64M en mi instalador de scripts. Esto es solo parte del código PHP que debería funcionar, pero probablemente debido a esta "M" no está leyendo correctamente el valor. Cómo arreglar esto ?

//memory_limit echo "<phpmem>"; if(key_exists(''PHP Core'', $phpinfo)) { if(key_exists(''memory_limit'', $phpinfo[''PHP Core''])) { $t=explode(".", $phpinfo[''PHP Core''][''memory_limit'']); if($t[0]>=64) $ok=1; else $ok=0; echo "<val>{$phpinfo[''PHP Core''][''memory_limit'']}</val><ok>$ok</ok>"; } else echo "<val></val><ok>0</ok>"; } else echo "<val></val><ok>0</ok>"; echo "</phpmem>/n";


Aquí hay otra forma más simple de verificar eso.

$memory_limit = return_bytes(ini_get(''memory_limit'')); if ($memory_limit < (64 * 1024 * 1024)) { // Memory insufficient } /** * Converts shorthand memory notation value to bytes * From http://php.net/manual/en/function.ini-get.php * * @param $val Memory size shorthand notation string */ 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; }


Gracias por la inspiración.

Tenía el mismo problema y, en lugar de copiar y pegar algunas funciones de Internet, escribí una herramienta de código abierto para ello. Siéntase libre de usarlo o de dar su opinión!

https://github.com/BrandEmbassy/php-memory

Solo instálalo usando Composer y luego obtendrás el límite de memoria de PHP actual de esta manera:

$configuration = new /BrandEmbassy/Memory/MemoryConfiguration(); $limitProvider = new /BrandEmbassy/Memory/MemoryLimitProvider($configuration); $limitInBytes = $memoryLimitProvider->getLimitInBytes();


Intente convertir el valor primero (por ejemplo: 64M -> 64 * 1024 * 1024). Después de eso, haga una comparación e imprima el resultado.

<?php $memory_limit = ini_get(''memory_limit''); if (preg_match(''/^(/d+)(.)$/'', $memory_limit, $matches)) { if ($matches[2] == ''M'') { $memory_limit = $matches[1] * 1024 * 1024; // nnnM -> nnn MB } else if ($matches[2] == ''K'') { $memory_limit = $matches[1] * 1024; // nnnK -> nnn KB } } $ok = ($memory_limit >= 640 * 1024 * 1024); // at least 64M? echo ''<phpmem>''; echo ''<val>'' . $memory_limit . ''</val>''; echo ''<ok>'' . ($ok ? 1 : 0) . ''</ok>''; echo ''</phpmem>'';


Muy viejo post. pero voy a dejar esto aquí:

/* converts a number with byte unit (B / K / M / G) into an integer */ function unitToInt($s) { (int)preg_replace_callback(''/(/-?/d+)(.?)/'', function ($m) { return $m[1] * pow(1024, strpos(''BKMG'', $m[2])); }, strtoupper($s)); } $mem_limit = unitToInt(ini_get(''memory_limit''));


Si está interesado en el límite de memoria CLI:

cat /etc/php/[7.0]/cli/php.ini | grep "memory_limit"

FPM / "Normal"

cat /etc/php/[7.0]/fpm/php.ini | grep "memory_limit"


Siempre que su matriz $phpinfo[''PHP Core''][''memory_limit''] contenga el valor de memory_limit , funciona lo siguiente:

  • El último carácter de ese valor puede señalar la notación abreviada. Si es inválido, es ignorado.
  • El comienzo de la cadena se convierte a un número de la manera específica de PHP: se omiten los espacios en blanco, etc.
  • El texto entre el número y la notación abreviada (si existe) se ignora.

Ejemplo:

# Memory Limit equal or higher than 64M? $ok = (int) (bool) setting_to_bytes($phpinfo[''PHP Core''][''memory_limit'']) >= 0x4000000; /** * @param string $setting * * @return NULL|number */ function setting_to_bytes($setting) { static $short = array(''k'' => 0x400, ''m'' => 0x100000, ''g'' => 0x40000000); $setting = (string)$setting; if (!($len = strlen($setting))) return NULL; $last = strtolower($setting[$len - 1]); $numeric = (int) $setting; $numeric *= isset($short[$last]) ? $short[$last] : 1; return $numeric; }

Los detalles de la notación abreviada se detallan en la entrada de Preguntas frecuentes de un manual de PHP y los detalles extremos son parte del Protocolo de algunos PHP Memory Stretching Fun .

Tenga cuidado si la configuración es -1 PHP no se limitará aquí, pero el sistema lo hace. Por lo tanto, debe decidir cómo el instalador trata ese valor.


Solución no tan exacta pero más simple:

$limit = str_replace(array(''G'', ''M'', ''K''), array(''000000000'', ''000000'', ''000''), ini_get(''memory_limit'')); if($limit < 500000000) ini_set(''memory_limit'', ''500M'');