Intereting Posts
Объедините png ontop из jpg и сохраните прозрачность с помощью php php http request content raw data enctype = multipart / form-data Разделители каталога PHP, заставляя косую черту; ненавязчивый Публикация проверки и представления собственной формы в PHP PHP как язык программирования на рабочем столе Веб-приложение должно взаимодействовать с последовательным портом Добавление разных случайных чисел в URL-адрес в массиве Javascript на каждом цикле Могу ли я передать ассоциативный массив в качестве аргумента в ReflectionMethod :: invokeArgs? Как отправить форму входа в ASP.NET с помощью PHP / cURL? Получить идентификатор сообщения текущего пользователя и добавить ссылку в меню не удалось получить токен доступа, связанный с api В PHP, как сохранить 1-ю часть ссылки, сохранить 2-й и динамически изменить остальные Какая хорошая система управления пользователями с открытым исходным кодом? Как я могу выйти из неактивных пользователей через 30 минут? Как сделать библиотеки PHP слабо связанными?

проверка memory_limit в PHP

Мне нужно проверить, не является ли 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 , он работает следующим образом:

    • Последний символ этого значения может сигнализировать сокращенную нотацию. Если он неверен, он игнорируется.
    • Начало строки преобразуется в число в свой собственный способ PHP: Whitespace игнорируется и т. Д.
    • Текст между номером и сокращенной записью (если таковой имеется) игнорируется.

    Пример:

     # 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'));