| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 |
| Спасибо. Сам склоняюсь к этому варианту. так и сделаю |