Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Утечки памяти


Автор: Dutchak Vitaly 16.7.2012, 15:12
Добрый день. Возникла необходимость написать парсер на PHP, который за проход должен парсить порядка 10000 страниц.
Но вот беда - много памяти жрет, хотя memory_limit стоит 64M - apache сжирает 1GB оперативы + 2GB свопа за 1000 распарсенных страниц. 
memory_get_usage показывает, что памяти под конец скрипта сжирается порядка 22-26MB. 

Server version: Apache/2.2.17 (Ubuntu)
PHP 5.3.5

Может кто сталкивался с такой проблемой?

Автор: MoLeX 16.7.2012, 18:24
пожалей сервер, в очередь ставь

Автор: Sanchezzz 16.7.2012, 20:39
Что применяете в парсере по шагам мы не телепаты и гадать можем сколько угодно, какие библиотеки, парсите данные из БД или удаленный файл.

Разумным выходом и быстрым решением будет уменьшение количество страниц за проход если файлы получаем удаленно.
также утечка может быть в незавершённых соединениях так как они имеют свойство зависать поэтому лучше сперва занести в БД потом раскидать по таблицам что нужно, другим скриптом обрабатывать из БД и ставить статусы задачи, (обработка , выполнено итд )






Автор: Dutchak Vitaly 17.7.2012, 08:52
Скрипт ходит по сайту и парсит HTML. В качестве парсера использую phpQuery. 
Для получения HTML использовал CURL, но потом переделал на get_headers + file_get_contents - никакой разницы при потреблении памяти нет.
Везде расставлены unset, GarbageCollector включен в пике скрипт ест 30-40MB, а апач сжирает все что есть в системе.

Кол-во файлов не уменьшить так просто, скрипт выполняет определенные задачи , и не известно сколько именно и каких страниц должен распарсить. В самом худшем случае около 10тыс.
Тут или разобраться с памятью или делать живую очередь.

Автор: Sanchezzz 17.7.2012, 11:00
file_get_contents без опциий может тратить больше времени до2+ сек на получение информации рекомендую вернутся к curl multi 
так как работает быстрей по времени.

Также сделать тестовые замеры по коду  путем тем же  memory_get_usage(); 
Но думаю проблема в сетевой части.
Если не уменьшить количество то тогда придется делать очереди с блокировками по сути будет выгоднее чем ждать когда скрипт ляжет или выполнит все + также даст возможность видеть  что выполнил что нет.

Автор: Dutchak Vitaly 17.7.2012, 11:17
Спасибо. Сам склоняюсь к этому варианту. так и сделаю smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)