2013-05-23 3 views
2

У меня в настоящее время есть скрипт, который будет работать довольно долго (разветвлено в отдельном отдельном процессе). Он не будет работать очень часто, но когда он это сделает, он будет использовать довольно большой объем памяти, главным образом, при обработке (многих) файлов XLS (> 10 МБ).Использование PHP ini_set "memory_limit" безопасно

У меня в настоящее время установлен предел памяти до 1024 М, когда этот скрипт работает с ограничением по времени 6000 секунд. Это верхний предел, однако на самом деле это не займет много времени (возможно, всего 5 минут).

Поскольку требуется огромное количество памяти, мне интересно, как PHP/Apache управляет памятью.

  • Является ли память автоматически освобождающейся при завершении сценария? Если нет, то когда это будет.
  • Нужно ли мне неявно освобождать объекты?
  • Возможно ли освободить память в то время изнутри скрипта
  • Слишком много 1024M, как это повлияет на сервер в конечном итоге.

Я использую PHPExcel Library, кстати.

+0

Используйте эту функцию, чтобы определить, сколько действительно нужно сценарию памяти. Http://php.net/manual/ru/function.memory-get-peak-usage.php (я имею в виду, чтобы отлаживать, чтобы выбрать оптимальное значение для memory_limit) –

ответ

2

Короткий ответ:

PHP использует подсчет ссылок, поэтому объекты будут освобождены, как только они не ссылаются. Если существует ссылочный цикл (например, объект A ссылается на объект B, который ссылается на объект A), сборщик мусора время от времени заботится о них.

Когда сценарий заканчивается, вся оставшаяся память возвращается в систему.

Длинный ответ:

ли память освобождается автоматически, когда сценарий завершается? Если нет, то когда это будет.

Память освобождается во время выполнения скрипта, как только объекты/переменные больше не ссылаются.

Если по какой-либо причине объекты по-прежнему ссылаются в конце сценария, они принудительно уничтожаются и освобождаются.

И затем сбрасывается распределитель памяти (что освобождает небольшое количество оставшейся выделенной памяти, например, собственный кеш распределителя).

Итак, в конце сценария все освобождается и доступно для выделения снова.

Если распределитель использует mmap() для выделения сегментов памяти внутри (что является значением по умолчанию, когда доступно mmap()), то выделение больших блоков и сброс блока распределения памяти также возвращают память в систему.

Нужно ли мне неявно освобождать объекты?

Нет. Просто убедитесь, что garbage collector is enabled, так что соблюдаются эталонные циклы.

Можно ли, чтобы освободить память немного в то время, из сценария

PHP использует подсчет ссылок, и освобождает объекты, как только они не ссылаются больше:

$a = new stdClass; 
$a = null; // the object is freed at this point 

function foo() { 
    $a = new stdClass; 
    return; // the object referenced by $a is freed at this point 
} 

Сбор ссылочных циклов manually может освободить память ранее, хотя обычно это не требуется.

Это 1024M слишком много, как это повлияет на сервер в конечном итоге.

Если вы запускаете этот сценарий с большой памятью в отдельном процессе, это не повлияет на сервер.

+0

очень повсюду и информативно. Спасибо. – 40Plot

Смежные вопросы