У меня есть PHP-скрипт с большим количеством людей, который извлекает их данные из внешнего ресурса через SOAP, модифицирует данные и отправляет их обратно. Из-за размера деталей я увеличил объем памяти PHP до 128 МБ. Приблизительно после 4 часов работы (вероятно, потребуется 4 дня, чтобы запустить), он исчерпал память. Вот основы того, что он делает:
$people = getPeople();
foreach ($people as $person) {
$data = get_personal_data();
if ($data == "blah") {
importToPerson("blah", $person);
} else {
importToPerson("else", $person);
}
}
После исчерпания памяти и сбоя я решил инициализировать $ data до цикла foreach
и, согласно top
, использование памяти для процесса не превысило 7,8%, и он работал в течение 12 часов.
Итак, мой вопрос: не запускает ли PHP сборщик мусора для переменных, инициализированных внутри цикла, даже если они используются повторно? Если система освобождает память, а PHP еще не пометил ее как пригодную для использования, и в конечном итоге она снова выйдет из строя (сейчас я поднял ее до 256 МБ, поэтому я изменил 2 вещи и не уверен, что это исправило, возможно, я мог бы изменить свой Сценарий обратно, чтобы ответить на это, но не хочу ждать еще 12 часов, пока он не разберется, чтобы выяснить)?
Я не использую Zend Framework, поэтому другой вопрос, подобный этому, я не считаю уместным.
РЕДАКТИРОВАТЬ: На самом деле у меня нет проблем со сценарием или что он делает. На данный момент, что касается всей системной отчетности, у меня нет проблем. Этот вопрос касается сборщика мусора и того, как / когда он восстанавливает ресурсы в цикле foreach и / или как система сообщает об использовании памяти процессом php.