Функция 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.
Она позволяет увеличивать лимит памяти, если это необходимо, и проверяет, действительно ли выделено достаточно памяти для выполнения задачи.

3 minutes read Administrator

Comments (0)

No comments yet
Only registered users can post new comments

Content author

Administrator

Offline

Administrator

Last logged: 2026-07-05 18:32

  • Page published: 2025-01-21 09:51
  • Last update: 2025-01-21 09:51