Мне нужно проверить, не является ли 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";
Попробуйте сначала преобразовать значение (например: 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>';
Вот еще один простой способ проверить это.
$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; }
Пока ваш массив $phpinfo['PHP Core']['memory_limit']
содержит значение memory_limit
, он работает следующим образом:
Пример:
# 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 Memory Stretching Fun .
Позаботьтесь, если параметр -1
PHP не будет ограничивать здесь, но система делает. Поэтому вам нужно решить, как установщик относится к этой ценности.
Не столь точное, но простое решение:
$limit = str_replace(array('G', 'M', 'K'), array('000000000', '000000', '000'), ini_get('memory_limit')); if($limit < 500000000) ini_set('memory_limit', '500M');
очень старый пост. но я просто оставлю это здесь:
/* 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'));