Управление лимитом оперативной памяти в PHP

Раздел: Администрирование PHP -> Настройка PHP

Управление памятью в PHP: настройка memory_limit

Ограничение памяти PHP (memory_limit) определяет максимальный объем оперативной памяти, который может использовать один скрипт. Неправильная настройка приводит к фатальным ошибкам Allowed memory size exhausted. Ниже рассмотрены основные способы изменения этого параметра и сопутствующие вопросы.

Как эффективно увеличить лимит памяти для всех скриптов?

Наиболее надежный способ - редактирование главного конфигурационного файла php.ini. После изменения параметра необходимо перезапустить веб-сервер (Apache, Nginx) или PHP-FPM.

; php.ini
memory_limit = 256M

Debian php (установка php на debian)

Значение можно задавать в мегабайтах (M), гигабайтах (G) или килобайтах (K). После сохранения файла проверьте изменение через phpinfo().

<?php
phpinfo();
?>

Php ubuntu (php на ubuntu)

Найдите строку memory_limit в выводе. Если значение не обновилось, убедитесь, что редактируется правильный php.ini (путь к нему указан в колонке Loaded Configuration File).

Типичная ошибка: после изменения php.ini значение не меняется, если используется PHP как модуль Apache - требуется полная перезагрузка сервера, а не просто перезапуск пула. На общих хостингах доступ к php.ini отсутствует; тогда используются альтернативные методы.

Как увеличить память только для одного скрипта?

Функция ini_set() позволяет установить лимит в коде до начала ресурсоемких операций.

<?php
ini_set('memory_limit', '512M');
// дальнейший код
?>

Localhost php (настройка локального сервера php)

Важно: эта настройка действует только на текущий скрипт и не влияет на другие. Если лимит превышен до вызова ini_set, исправить ситуацию не удастся.

Проблема: на некоторых хостингах функция ini_set может быть запрещена (disabled). В таких случаях проверяют директиву disable_functions в php.ini. Решение - обратиться к хостеру или использовать .user.ini.

Как настроить лимит через .htaccess (Apache)?

Если используется Apache с модулем mod_php, директиву можно задать в корневом .htaccess или в конфигурации виртуального хоста.

# .htaccess
php_value memory_limit 128M

Php windows (php на windows)

Убедитесь, что модуль mod_php включен и файл .htaccess разрешен (AllowOverride Options или All).

Ошибка 500 (Internal Server Error) возникает, если синтаксис неверен или директива не разрешена. Проверьте синтаксис и права доступа.

Как узнать текущий лимит и использование памяти?

Для диагностики используют функции memory_get_usage() и memory_get_peak_usage().

<?php
echo 'Текущее использование: ' . memory_get_usage() . ' байт';
echo '<br>';
echo 'Пиковое использование: ' . memory_get_peak_usage() . ' байт';
echo '<br>';
echo 'Лимит: ' . ini_get('memory_limit');
?>

Index php page info (страница phpinfo())

Позволяет определить, сколько памяти реально требуется скрипту, и адекватно установить лимит.

Распространенная ошибка: слишком высокий лимит (например, 2G) на 32-битной системе приводит к невозможности выделить память. Рекомендуется не превышать доступный объем физической памяти сервера.

Как настроить память через .user.ini (CGI/FastCGI)?

На серверах с PHP-FPM или CGI можно использовать файл .user.ini в корне сайта.

; .user.ini
memory_limit = 256M

Настройки применяются автоматически, перезагрузка не требуется.

Если файл не действует, проверьте, что веб-сервер настроен на чтение .user.ini (обычно включено по умолчанию). На некоторых хостингах может использоваться кастомная политика.

- Change php (изменение php)
- изменить настройки php (изменение настроек php)
- Php ini memory (настройка memory_limit в php)

Расширенные примеры работы с памятью PHP

Ниже приведены более сложные сценарии, включающие мониторинг, динамическое изменение лимита и обработку ошибок.

Пример
<?php
// Пример 1: Динамическое увеличение памяти перед обработкой большого файла
function processLargeFile($filename) {
    $neededMemory = filesize($filename) * 2; // примерная оценка
    $currentLimit = ini_get('memory_limit');
    $limitBytes = returnBytes($currentLimit);
    if ($neededMemory > $limitBytes) {
        $newLimit = $neededMemory + 10 * 1024 * 1024; // +10МБ запас
        ini_set('memory_limit', $newLimit);
    }
    // ... обработка файла
}

function returnBytes($val) {
    $val = trim($val);
    $last = strtolower($val[strlen($val)-1]);
    $val = (int)$val;
    switch($last) {
        case 'g': $val *= 1024;
        case 'm': $val *= 1024;
        case 'k': $val *= 1024;
    }
    return $val;
}
?>
Результат: функция динамически увеличит лимит, если файл слишком большой. Оценка может быть неточной, поэтому используется запас.
Пример
<?php
// Пример 2: Проверка пикового потребления и логирование
$startMemory = memory_get_usage();
// ресурсоемкая операция: создание большого массива
$bigArray = range(1, 100000);
$peak = memory_get_peak_usage();
error_log("Пиковое использование: " . round($peak / 1024 / 1024, 2) . " МБ");
unset($bigArray);
?>
Результат: в лог ошибок запишется фактическое максимальное потребление, полезно для профилирования.
Пример
<?php
// Пример 3: Настройка через wp-config.php (WordPress)
define('WP_MEMORY_LIMIT', '256M');
define('WP_MAX_MEMORY_LIMIT', '512M'); // для административной панели
?>
Результат: WordPress использует эти константы вместо php.ini. WP_MAX_MEMORY_LIMIT действует только в админке.
Пример
<?php
// Пример 4: Обработка ошибки памяти через register_shutdown_function
function handleFatalError() {
    $error = error_get_last();
    if ($error && $error['type'] === E_ERROR && strpos($error['message'], 'Allowed memory size') !== false) {
        echo 'Недостаточно памяти. Попробуйте увеличить лимит.';
        // дополнительная логика
    }
}
register_shutdown_function('handleFatalError');
// намеренно вызываем превышение
$data = str_repeat('a', 1024*1024*1024); // 1ГБ строки
?>
Результат: вместо белого экрана выводится сообщение об ошибке и можно выполнить очистку.
Пример
<?php
// Пример 5: Использование memory_limit в сочетании с операционной системой
// В некоторых случаях полезно проверить реальную доступную память через shell
echo shell_exec("free -m | grep Mem | awk '{print $7}'"); // свободная память в МБ
?>
Результат: выводит объем свободной памяти, что помогает установить адекватный лимит (не более 80% свободной памяти).

Ограничение памяти PHP - comments

En
ограничение памяти php (php)