У меня есть 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 вещи и не уверен, что это исправило, я, вероятно, мог бы изменить свой script обратно, чтобы ответить на этот вопрос, но не хотите ждать еще 12 часов, пока он сломается, чтобы выяснить это)?
Я не использую структуру Zend, поэтому другой вопрос, подобный этому, я не считаю уместным.
РЕДАКТИРОВАТЬ: На самом деле у меня нет проблем со сценарием или тем, что он делает. На данный момент, что касается всех системных отчетов, у меня нет никаких проблем. Этот вопрос касается сборщика мусора и того, как/когда он освобождает ресурсы в цикле foreach и/или как система сообщает об использовании памяти процессом php.
importToPerson()
? - person PeeHaa   schedule 03.04.2012if ($data = "blah") {
не должно бытьif ($data == "blah") {
? - person PeeHaa   schedule 03.04.2012