51

我需要检查是否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"; 
4

9 回答 9

69

检查命令行:

php -i | grep "memory_limit"
于 2019-01-26T22:41:50.817 回答
45

尝试先转换值(例如: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 >= 64 * 1024 * 1024); // at least 64M?

echo '<phpmem>';
echo '<val>' . $memory_limit . '</val>';
echo '<ok>' . ($ok ? 1 : 0) . '</ok>';
echo '</phpmem>';

请注意,上面的代码只是一个想法。不要忘记处理 -1(无内存限制)、仅整数值(以字节为单位的值)、G(以千兆字节为单位的值)、k/m/g(以千字节、兆字节、千兆字节为单位的值,因为速记不区分大小写), ETC。

于 2012-04-18T12:38:41.820 回答
18

1. PHP-CLI:

检查ini的命令行:

$ php -r "echo ini_get('memory_limit');"

或者检查 php-cli 信息和 grepmemory_limit值:

$ php -i | grep "memory_limit"

2. PHP-FPM:

将此行粘贴到index.php任何可以在浏览器上查看的 php 文件中,然后检查结果:

<?php echo ini_get('memory_limit');

另一种方法是使用phpinfo()

<?php phpinfo();

然后寻找memory_limit价值 在此处输入图像描述

于 2019-05-09T09:14:10.903 回答
13

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

$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;
}
于 2015-03-11T04:31:55.943 回答
6

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

/* 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'));
于 2017-08-19T04:46:55.903 回答
4

只要您的数组$phpinfo['PHP Core']['memory_limit']包含 的值memory_limit,它就可以执行以下操作:

  • 该值的最后一个字符可以表示速记符号。如果它是无效的,它会被忽略。
  • 字符串的开头以 PHP 自己的特定方式转换为数字:忽略空格等。
  • 数字和速记符号(如果有)之间的文本被忽略。

例子:

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

速记符号的详细信息在PHP 手册的 FAQ 条目中进行了概述,极端细节是一些 PHP Memory Stretching Fun 协议的一部分

请注意,如果设置为-1PHP,则此处不会限制,但系统会限制。因此,您需要决定安装程序如何处理该值。

于 2012-04-18T13:08:01.273 回答
4

不是那么精确但更简单的解决方案:

$limit = str_replace(array('G', 'M', 'K'), array('000000000', '000000', '000'), ini_get('memory_limit'));
if($limit < 500000000) ini_set('memory_limit', '500M');                     
于 2015-10-09T09:48:58.027 回答
4

如果您对 CLI 内存限制感兴趣:

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

FPM /“正常”

cat /etc/php/[7.0]/fpm/php.ini | grep "memory_limit"
于 2018-06-11T13:35:41.803 回答
2

谢谢你的灵感。

我遇到了同样的问题,我没有只是从互联网上复制粘贴一些功能,而是为它编写了一个开源工具。随意使用它或提供反馈!

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

只需使用 Composer 安装它,然后您将获得当前的 PHP 内存限制,如下所示:

$configuration = new \BrandEmbassy\Memory\MemoryConfiguration();
$limitProvider = new \BrandEmbassy\Memory\MemoryLimitProvider($configuration);
$limitInBytes = $memoryLimitProvider->getLimitInBytes();
于 2018-04-23T14:16:23.170 回答