在PHP中检查memory_limit

Spa*_*ust 32 php memory-limit

我需要检查是否memory_limit至少64M在我的脚本安装程序中.这只是应该工作的PHP代码的一部分,但可能是因为这个"M"它没有正确读取值.如何解决这个问题?

  //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"; 
Run Code Online (Sandbox Code Playgroud)

Muh*_*vin 31

尝试首先转换该值(例如:64M - > 64*1024*1024).之后,进行比较并打印结果.

<?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>';
Run Code Online (Sandbox Code Playgroud)

  • 提供的正则表达式不完整,不精确,将导致各种安装的错误结果. (5认同)

Jar*_*Chu 13

检查ini的命令行:

$ php -r "echo ini_get('memory_limit');"
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,这会返回 PHP 的 CLI 版本的内存限制,但您的 nginx/apache 将使用“其他”PHP 进程,即“fpm”版本的 PHP(抱歉不知道由谁来描述)。最好在 .ini 中手动检查: `/etc/php/7.4/cli/php.ini` 和 `/etc/php/7.4/fpm/php.ini` (5认同)

小智 12

这是另一种更简单的检查方法.

$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;
}
Run Code Online (Sandbox Code Playgroud)

  • 那这个呢?`$bytes = (int)$mem * 1024 ** ['k' =&gt; 1, 'm' =&gt; 2, 'g' =&gt; 3][strtolower($mem)[-1]] ?? 0;` (2认同)

小智 10

在命令行中检查:

php -i | grep "memory_limit"
Run Code Online (Sandbox Code Playgroud)

  • 你能解释我从中得到的输出吗:memory_limit =&gt; -1 =&gt; -1 (2认同)
  • 如果终端打印 =&gt; -1 =&gt; -1 这表明内存限制是无限的 (2认同)

小智 5

很老的帖子。但我将只留在这里:

/* 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'));
Run Code Online (Sandbox Code Playgroud)

  • 这是什么?请不要只是邮编。说明您的代码如何以及为什么会解决问题。 (2认同)