2012-02-09 2 views
0

Это, кажется, было обсуждено совсем немного. Я пробовал несколько вещей, которые я нашел, но не повезло.PHP - проблемы с памятью кометы

У меня есть «хакерский» кеш, который хранит объекты, полученные из вызовов XML. Похоже, что вызовы XML слишком длились при загрузке страниц, поэтому пользователь может нажать кнопку в администраторе, чтобы перестроить кеш. Процедура кэширования продолжает умирать с ошибкой выделения памяти.

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

Я «отключаю» каждую переменную после того, как закончу ее использование. Я вызываю gc_collect_cycles(), который, похоже, ничего не делает.

У меня есть две анонимные функции, которые вызываются через более .... могли ли они быть виновниками?

Что я должен был искать? Помогло бы вам вообще спать()?

код Редактировать

Вот код: http://pastebin.com/8M1Dk73E

В строке 79 кода Pastebin, я звоню gc_collect_cycles. Не уверен, что это хорошее место, чтобы поместить это или нет.

Я использую петли foreach вместо циклов, которые, как я знаю, имеют огромное значение с копируемыми объектами, но я думаю, что если я отключу переменные, он должен работать одинаково, даже если время выполнения больше.

Ну, я в недоумении, поэтому любые мысли были бы полезными.

+0

Несколько вопросов: Сколько памяти выделено для PHP? Не удалось распечатать сообщение об ошибке? Если вы запустили его десять раз, изменяя порядок, в котором элементы извлекаются, обычно ли он заканчивается на том же номере строки (знак того, что это может быть код, ответственный за большой захват памяти)? Это может реально помочь увидеть этот большой кусок кода :) –

+0

выделено 128 МБ, ошибка: «Неустранимая ошибка: Разрешенная память размером 134217728 байт, израсходованная (пыталась выделить 5426168 байт) в ...» Она фактически умирает в той же строке каждый раз, что я с удовольствием признаю, связано с кодом ... Я просто не знаю, что еще делать, освобождая память. Это не то, о чем я могу сказать, о, мы просто увеличим размер памяти и назовут это днем ​​... потому что размер извлекаемых данных может быть массовым для некоторых людей. –

ответ

1

Это может быть связано с gc_collect_cycles. В некоторых версиях php и в некоторых условиях цикла эта функция не сможет выполнить цикл: например, см.: https://bugs.php.net/bug.php?id=53803 и https://bugs.php.net/bug.php?id=53071

Если вы можете, попробуйте обновить PHP до 5.3.9 и посмотреть, работает ли он. Если нет, попробуйте отбросить коллекцию и полагаться исключительно на unset() (имея в виду, что отмена глобальной переменной уничтожает ее только внутри функции), и вам нужно будет отменить ее из массива $ GLOBALS, если вы хотите уничтожить ее повсюду.

Если вы все еще застряли, попробуйте тщательно отслеживать свою память, когда она перемещается по петле с помощью memory_get_usage() с запиской после чего-то, что должно требовать или освобождать память. Что-то вроде:

try{ 
    $result = $client->GetListingPhotosWithFullPath(array('mlsID'=>$bid->MlsID, 'mlsNumber'=>$bid->MlsNumber)); 
    echo "Got Photos with Full Path on line ".__LINE__." - Now using ".memory_get_usage()."<br />\n"; 
    $listing->photos = $result->GetListingPhotosWithFullPathResult->Photo; 
    echo "Setting $listing->photos on ".__LINE__." - Now using ".memory_get_usage()."<br />\n"; 
    (isset($opt->comet)) ? $msg("Photos received.") : ''; 

    //Memory Cleanup 
    unset($result); 
    echo "\$result unseet on ".__LINE__." - Now using ".memory_get_usage()."<br />\n"; 
} 

Это должно позволить вам увидеть, где ваш цикл наращивает память.

+0

Ну, я все еще застрял, но я думаю, что это еще один вопрос.Проблема с памятью возникает при создании массива, который я в конечном итоге записываю в файл. Он просто не может держать массив в памяти, по-видимому, достаточно длинным, чтобы я мог получить все это и записать его в файл. :( –

+0

Можете ли вы попытаться построить файл по биту, а не держать все в массиве: 'file_put_contents ($ filename, $ data, FILE_APPEND);' и затем снять эту часть данных? –