Ik moet controleren of memory_limit
ten minste 64M
is in mijn scriptinstallatieprogramma. Dit is slechts een deel van de PHP-code die zou moeten werken, maar waarschijnlijk vanwege deze “M” leest het de waarde niet goed. Hoe dit op te lossen?
//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";
Antwoord 1, autoriteit 100%
Controleren op de opdrachtregel:
php -i | grep "memory_limit"
Antwoord 2, autoriteit 65%
Probeer eerst de waarde om te rekenen (bijvoorbeeld: 64M -> 64 * 1024 * 1024). Vergelijk daarna en druk het resultaat af.
<?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 >= 64 * 1024 * 1024); // at least 64M?
echo '<phpmem>';
echo '<val>' . $memory_limit . '</val>';
echo '<ok>' . ($ok ? 1 : 0) . '</ok>';
echo '</phpmem>';
Houd er rekening mee dat de bovenstaande code slechts een idee is.Vergeet niet om -1 (geen geheugenlimiet), alleen integer (waarde in bytes), G (waarde in gigabytes) te verwerken ), k/m/g (waarde in kilobytes, megabytes, gigabytes omdat steno niet hoofdlettergevoelig is), enz.
Antwoord 3, autoriteit 26%
1. PHP-CLI:
Opdrachtregel om ini in te checken:
$ php -r "echo ini_get('memory_limit');"
Of controleer php-cli info en grep memory_limit
waarde:
$ php -i | grep "memory_limit"
2. PHP-FPM:
Plak deze regel in index.php
of een php-bestand dat in een browser kan worden bekekenen controleer het resultaat:
<?php echo ini_get('memory_limit');
Een alternatieve manier is het gebruik van phpinfo()
:
<?php phpinfo();
vind dan voor memory_limit
waarde
Antwoord 4, autoriteit 19%
Hier is nog een eenvoudigere manier om dat te controleren.
$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]);
$val = substr($val, 0, -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;
}
Antwoord 5, autoriteit 9%
heel oud bericht. maar ik laat dit hier gewoon achter:
/* converts a number with byte unit (B / K / M / G) into an integer */
function unitToInt($s)
{
return (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'));
Antwoord 6, autoriteit 6%
Niet zo exacte maar eenvoudigere oplossing:
$limit = str_replace(array('G', 'M', 'K'), array('000000000', '000000', '000'), ini_get('memory_limit'));
if($limit < 500000000) ini_set('memory_limit', '500M');
Antwoord 7, autoriteit 6%
Zolang je array $phpinfo['PHP Core']['memory_limit']
de waarde van memory_limit
, het werkt als volgt:
- Het laatste teken van die waarde kan de steno-notatie aangeven. Als het een ongeldige is, wordt deze genegeerd.
- Het begin van de string wordt geconverteerd naar een getal op PHP’s eigen specifieke manier: witruimte genegeerd etc.
- De tekst tussen het nummer en de verkorte notatie (indien aanwezig) wordt genegeerd.
Voorbeeld:
# 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;
}
Details van de stenonotatie staan beschreven in a De FAQ-invoer van de PHP-handleidingen extreme details maken deel uit van Protocol van wat PHP Memory Stretching Fun.
Let op als de instelling -1
is, PHP zal hier niet beperken, maar het systeem wel. U moet dus beslissen hoe het installatieprogramma met die waarde omgaat.
Antwoord 8, autoriteit 6%
Als u geïnteresseerd bent in de CLI-geheugenlimiet:
cat /etc/php/[7.0]/cli/php.ini | grep "memory_limit"
FPM / “Normaal”
cat /etc/php/[7.0]/fpm/php.ini | grep "memory_limit"
Antwoord 9, autoriteit 3%
Bedankt voor je inspiratie.
Ik had hetzelfde probleem en in plaats van een functie van internet te kopiëren en plakken, heb ik er een open source-tool voor geschreven. Voel je vrij om het te gebruiken of feedback te geven!
https://github.com/BrandEmbassy/php-memory
Installeer het gewoon met Composer en dan krijg je de huidige PHP-geheugenlimiet als volgt:
$configuration = new \BrandEmbassy\Memory\MemoryConfiguration();
$limitProvider = new \BrandEmbassy\Memory\MemoryLimitProvider($configuration);
$limitInBytes = $memoryLimitProvider->getLimitInBytes();