Функция cot_memory_allocate в Cotonti
Функция cot_memory_allocate предназначена для проверки, есть ли достаточное количество доступной памяти для выполнения требуемой операции в PHP. Она пытается выделить нужное количество памяти, увеличивая лимит памяти, если это необходимо.
Описание функции cot_memory_allocate
Функция cot_memory_allocate предназначена для проверки, есть ли достаточное количество доступной памяти для выполнения требуемой операции в PHP. Она пытается выделить нужное количество памяти, увеличивая лимит памяти, если это необходимо.
Код функции
/**
* Allocate memory
*
* @param int $needMemory Memory to allocate in bytes
* @return bool TRUE if enough memory is available, FALSE otherwise
*/
function cot_memory_allocate($needMemory)
{
$needMemory = (int) $needMemory;
if (empty($needMemory)) {
return false;
}
// Getting memory occupied by the script (in bytes)
$usedMem = memory_get_usage(true);
$haveMem = ini_get('memory_limit');
// no limit set, so we try any way
if ($haveMem == '-1') {
return true;
}
preg_match('/(\d+)(\w+)/', $haveMem, $mtch);
if (!empty($mtch[2])) {
$mtch[2] = mb_strtoupper($mtch[2]);
if ($mtch[2] == 'G') {
$haveMem = $mtch[1] * 1073741824;
} elseif ($mtch[2] == 'M') {
$haveMem = $mtch[1] * 1048576;
} elseif ($mtch[2] == 'K') {
$haveMem = $mtch[1] * 1024;
}
}
$needMem = intval($needMemory + $usedMem);
if ($haveMem < $needMem) {
// Could not allocate memory
if (!ini_set('memory_limit', $needMem)) return false;
} else {
return true;
}
// Making sure we could allocate enough memory
$haveMem = ini_get('memory_limit');
preg_match('/(\d+)(\w+)/', $haveMem, $mtch);
if (!empty($mtch[2])) {
$mtch[2] = mb_strtoupper($mtch[2]);
if ($mtch[2] == 'G') {
$haveMem = $mtch[1] * 1073741824;
} elseif ($mtch[2] == 'M') {
$haveMem = $mtch[1] * 1048576;
} elseif ($mtch[2] == 'K') {
$haveMem = $mtch[1] * 1024;
}
}
// No, we couldn't allocate enough memory
if ($haveMem < $needMem) {
return false;
}
return true;
}
Параметры:$needMemory (int): Количество памяти, которое нужно выделить в байтах. Это значение преобразуется в целое число.
Возвращаемое значение:
bool:
TRUE, если достаточно памяти или если удалось выделить требуемое количество памяти.
FALSE, если недостаточно памяти или если не удалось изменить лимит памяти.
Логика работы:
Проверка на нулевое значение:
Если $needMemory пустое или равно нулю, функция сразу возвращает false.
Получение текущего использования памяти:
С помощью memory_get_usage(true) функция получает текущую память, занятую скриптом.
Получение лимита памяти:
Функция получает значение лимита памяти с помощью ini_get('memory_limit'). Если лимит не установлен (-1), то память не ограничена, и функция возвращает true.
Преобразование лимита памяти:
Лимит памяти может быть задан в разных единицах (ГБ, МБ, КБ), например: 128M, 2G. Функция проверяет единицу измерения и преобразует лимит в байты:
G — гигабайты (умножаются на 1073741824),
M — мегабайты (умножаются на 1048576),
K — килобайты (умножаются на 1024).
Проверка, хватает ли памяти:
Функция проверяет, хватает ли текущего доступного лимита памяти для того, чтобы выделить требуемое количество памяти, включая уже использованную память.
Попытка изменить лимит памяти:
Если текущий лимит памяти недостаточен, функция пытается изменить его с помощью ini_set('memory_limit', $needMem). Если это не удается, возвращается false.
Повторная проверка:
После попытки изменить лимит памяти функция снова проверяет доступную память. Если после изменения лимита памяти всё равно недостаточно, возвращается false.
Возвращение результата:
Если памяти достаточно, функция возвращает true, иначе false.
Пример использования:
$requiredMemory = 1024 * 1024 * 10; // 10MB
if (cot_memory_allocate($requiredMemory)) {
echo "Достаточно памяти.";
} else {
echo "Недостаточно памяти.";
}
Заключение:
Функция cot_memory_allocate полезна для динамического управления памятью в скриптах, которые могут потребовать больше памяти, чем по умолчанию установлено в конфигурации PHP.
Она позволяет увеличивать лимит памяти, если это необходимо, и проверяет, действительно ли выделено достаточно памяти для выполнения задачи.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 21.01.2025 09:51
- Последнее обновление: 21.01.2025 09:51