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