Методы борьбы с утечками памяти и GDI в IE для Human Emulator

В этой статье я расскажу особенности организации сбора данных через Human Emulator с учетом того что в Internet Explorer существуют утечки памяти. Данная особенность не позволяет просто написать скрипт, который бы работал бесконечно. Например особенно сильно это проявляется при запросах данных с Adwords. Так например уже при 10-30 обновлений страниц, из-за-за насыщенности JS на странице, происходит переполнение памяти (на 1 копию программы Windows может выделить только 2Gb памяти). А на все запущенные программы всего 10 000 GDI ресурсов. Но варианты есть всегда.

как побороть утечки памяти IE

борьба с утечками памяти в IE

Есть несколько методов  решения этой задачи:

1. Открытие нескольких вкладок с браузерами во время работы

В хуман эмуляторе есть возможность открыть несколько закладок с IE. Каждая из закладок представляет из себя полностью самодостаточный браузер со своими параметрами, DOM моделью и соответственно JS объектами. Закрывая такую закладку мы освобождаем всю память, которую занимает этот браузер. Для этого в программе есть команды $browser->set_count($count) и $browser->set_active_browser($num), которые соответственно задают число закладок с браузерами и активную закладку. Организовав скрипт что он вначале открывает дополнительную закладку, работает в ней, а затем когда памяти или ресурсов становится мало, — то закрывает и пересоздает ее. Таким образом происходит очистка памяти и нам это позволяет осуществлять сбор данных в непрерывном режиме.

2. Использование команды browser->recreate()

Команда $browser->recreate() — по факту тот же самый вариант, описанный в первом случае, только для одной закладки. Скрипт во время работы определяет момент когда памяти и GDI ресурсов становится недостаточно и пересоздает браузер, очищая лишнее. Далее идет работа в обычном режиме и это тоже позволяет нам осуществлять сбор данных с интернета, несмотря на утечки памяти, происходящие в IE.

3. Использование команды перезапуска XHE для очистки памяти в IE

В Human Emulator также существует команда $app->restart, которая сама по себе достаточно гибкая. В нашем же случае, в момент когда ресурсов становится мало или еще по какой-либо причине мы просто перезапускаем текущий скрипт и он начинает свою работу в абсолютно чистом IE. Это самый надежный вариант. Но для его реализации нужно запоминать состояние всех переменных и объектов, если конечно PHP скрипт не запущен отдельно из командной строки (тогда можно просто пересоздаем экземпляр хумана без перезапуска самого скрипта). Для этого можно использовать например текстовые файлы или базу данных.

4. Управление перезапуском скрипта через настройки

перезапуск Human Emulator после утечек памяти

перезапуск Human Emulator после утечек памяти

В основных настройках Human Emulator есть группа чекбоксов, отвечающих на реакцию хуман эмулятора во время переполнения памяти или нехватки ресурсов. Выставив флажки соответствующим образом мы можем получить автоматический перезапуск текущего скрипта, если произошли утечки памяти. После перезапуска нам опять же надо восстановить все нужные нам для работы переменные.

Функции позволяющие узнать о текущем состоянии памяти и занятых ресурсах

Для того чтобы узнать в каком сейчас состоянии находится хуман эмулятор и как скоро его надо перезапускать или пересоздавать страницы с браузерами, можно воспользоваться рядом функций:

  • $debug->get_cur_mem_size() — получить количество памяти, который сейчас использует программа
  • $debug->get_gui_resources() — получить число GDI ресурсов, которые сейчас использует программа
  • $debug->get_min_mem_size() — получает минимальный размер памяти, когда-либо занимаемый программой в текущем запуске
  • $debug->get_max_mem_size() — получает максимальныйразмер памяти, когда-либо занимаемый программой в текущем запуске
  • $debug->get_free_physical_mem_size() — получает размер свободной физической памяти
  • $debug->optimize_memory() — производит единовременную оптимизацию и дефрагментацию памяти

Вывод :

Таким образом мы видим что для организации сбора данных, используя программу Human Emulator у нас достаточно функционала. Мы можем бороться с утечками памяти Internet Explorer’a различными методами и организовывать автоматический сбор данных с интернета в непрерывном режиме. Далее я расскажу о принципах удаленного использования программы. Т.е как поставить ее на сервер и управлять ее работой с любого места в интернете.

Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс
Опубликовано в Human Emulator, Обучение Метки: ,

Добавить комментарий

Сентябрь 2017
Пн Вт Ср Чт Пт Сб Вс
« Фев    
 123
45678910
11121314151617
18192021222324
252627282930