checking memory_limit in PHP

后端 未结 9 1472
臣服心动
臣服心动 2020-12-29 01:40

I\'m need to check if memory_limit is at least 64M in my script installer. This is just part of PHP code that should work, but probably due to this

相关标签:
9条回答
  • 2020-12-29 02:03

    As long as your array $phpinfo['PHP Core']['memory_limit'] contains the value of memory_limit, it does work the following:

    • The last character of that value can signal the shorthand notation. If it's an invalid one, it's ignored.
    • The beginning of the string is converted to a number in PHP's own specific way: Whitespace ignored etc.
    • The text between the number and the shorthand notation (if any) is ignored.

    Example:

    # 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 of the shorthand notation are outline in a PHP manual's FAQ entry and extreme details are part of Protocol of some PHP Memory Stretching Fun.

    Take care if the setting is -1 PHP won't limit here, but the system does. So you need to decide how the installer treats that value.

    0 讨论(0)
  • 2020-12-29 02:12

    Checking on command line:

    php -i | grep "memory_limit"
    
    0 讨论(0)
  • 2020-12-29 02:17

    Not so exact but simpler solution:

    $limit = str_replace(array('G', 'M', 'K'), array('000000000', '000000', '000'), ini_get('memory_limit'));
    if($limit < 500000000) ini_set('memory_limit', '500M');                     
    
    0 讨论(0)
  • 2020-12-29 02:18

    Here is another simpler way to check that.

    $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;
    }
    
    0 讨论(0)
  • 2020-12-29 02:18

    very old post. but i'll just leave this here:

    /* 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'));
    
    0 讨论(0)
  • 2020-12-29 02:20

    Try to convert the value first (eg: 64M -> 64 * 1024 * 1024). After that, do comparison and print the result.

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

    Please note that the above code is just an idea. Don't forget to handle -1 (no memory limit), integer-only value (value in bytes), G (value in gigabytes), k/m/g (value in kilobytes, megabytes, gigabytes because shorthand is case-insensitive), etc.

    0 讨论(0)
提交回复
热议问题