Вопрос по php – проверка памяти в PHP

22

Мне нужно проверить,memory_limit по крайней мере64M в моем скрипте установщика. Это всего лишь часть PHP-кода, который должен работать, но, вероятно, из-за этого & quot; M & quot; он неправильно читает значение. Как это исправить?

<code>  //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"; 
</code>
Можешь показатьvar_dump($phpinfo);, или по крайней мереvar_dump($phpinfo['PHP Core']);чтобы мы могли видеть, с чего вы начинаете? DaveRandom
Я использую код XML, так что это невозможно. Spacedust

Ваш Ответ

8   ответов
11

$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;
}
2

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

FPM / "Нормальный"

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

/* 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'));
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
2

$limit = str_replace(array('G', 'M', 'K'), array('000000000', '000000', '000'), ini_get('memory_limit'));
if($limit < 500000000) ini_set('memory_limit', '500M');                     
4

$phpinfo['PHP Core']['memory_limit'] содержит значениеmemory_limit, это работает следующее:

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.

Пример:

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

Детали сокращенной записи приведены в общих чертах взапись FAQ по PHP-руководству и экстремальные детали являются частьюПротокол некоторых PHP растяжения памяти Fun.

Позаботьтесь, если настройка-1 PHP не будет ограничивать здесь, но система делает. Поэтому вам нужно решить, как установщик будет относиться к этому значению.

Error: User Rate Limit Exceeded$numeric = 0 + $setting;Error: User Rate Limit Exceeded$numeric = (int)$setting;
Error: User Rate Limit Exceeded
0

У меня была та же проблема, и вместо того, чтобы просто скопировать какую-то функцию из Интернета, я написал для нее инструмент с открытым исходным кодом. Не стесняйтесь использовать его или оставить отзыв!

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

Просто установите его с помощью Composer, и тогда вы получите текущий предел памяти PHP следующим образом:

$configuration = new \BrandEmbassy\Memory\MemoryConfiguration();
$limitProvider = new \BrandEmbassy\Memory\MemoryLimitProvider($configuration);
$limitInBytes = $memoryLimitProvider->getLimitInBytes();
24

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>';
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
2

Проверка в командной строке:

php -i | grep "memory_limit"

Похожие вопросы