четверг, 5 декабря 2013 г.

Пишем простейший сборщик, использующий Google API на PHP. (Многопоточность)

многопоточный сбор Google API

В прошлый раз я описал как организовать сбор данных на PHP, используя прокси сервера. Скрипт брал слова из файла и запрашивал поисковые результаты по ним через Goggle API. Все это работало через прокси, что существенно повышало скорость работы с Google API. Но все же был существенный недостаток в работе этого скрипта : в текущий момент времени шел только один запрос, хоть мы и использовали прокси сервера. Однако в один и тот же момент времени мы можем делать сразу несколько запросов через прокси, что существенно увеличит скорость работы нашего скрипта.
PHP Скрипт Мультипоточного сбора
Я решил сделать код который будет разбивать задачу на заданное количество потоков. Создавать папки с PHP сборщиком заданной части поисковых запросов и запускать сбор в несколько потоков. Также для этой задачи прокси тоже будут разбиваться на заданное число частей, чтобы в каждом из сборщиков были свои непересекающиеся с другими прокси. После некоторого времени у меня получился следующий код :  здесь $num_threads - число потоков сборщика. $threads_folder - папка где будут создаваться потоки. Этот код разбивает файлы проксей in/proxy.txt  и поисковых результатов in/queries.txt на заданное количество частей, копирует код каждого сборщика из ./src и создает папки со всей структурой для каждого потока.
Далее создается файл run.bat в главной папке, который запускает на выполнение файлы run.php для каждого потока. Тут следует отметить особенности создания этого bat файла, каждый поток запускается следующим образом :  start "номер потока" /i /b "c:/php/php.exe" "Полный путь к run.php каждого потока" :
  • start - запускать php.exe в асинхронном режиме
  • /i - брать настройки из родительского bat  файла для каждого потока
  • /b - не создавать отдельных окон консольных окон для каждого потока
И в файле run.php первая строчка chdir(__DIR__);  - устанавливает текущую папку скрипта для каждого потока. Это надо чтобы при любой ситуации ПХП выстраивал все подключаемые библиотеки относительно текущей папки для каждого потока. И команда system("cmd /c \"".$bat_file_path."\""); - запускает созданный bat файл, который запускает на сбор все потоки. В итоге мы получаем следующий лог, например для первого потока :

лог многопоточного сбора Google API

Выводы
Запустив на сбор этот код мы собираем 45 запросов где-то за 55 сек. Т.е примерно в 3 раза быстрее для 5 потоков, по сравнению со сбором в один поток, зависимость тут не линейная, но очень близкая к ней. Таким образом чем большее количество потоков мы запускаем тем выше у нас скорость. Но тут большую роль играет качество и скорость прокси серверов. Т.е на каждый поток нужно как минимум 30-60 хороших прокси , чтобы было как можно меньше неудачных запросов для каждого прокси. И тут еще лучше всего воспользоваться платными прокси серверами,  но также есть несколько вариантов как улучшить работу скрипта не прибегая к платным прокси серверам. Это следующее :
  • Увеличение эффективности использования прокси
  • Оптимизация узких мест скрипта
  • Работа через TOR и другие анонимайзеры
  • Создание своих прокси серверов на VPS
  • Использование VPN
И об этом я расскажу в следующих статьях.  Кроме того в процессе работы у нас уже получилось достаточно много кода. В следующем посту я оптимизирую этот код, заодно покажу основные принципы оптимизации и проектирования для сбора данных на PHP. Ну и как всегда напоследок я даю ссылки на материалы на x-scripts.com касательно этого скрипта.
Материалы
Весь исходный код по этой статье можно скачать здесь. Руководство «Как запустить этот и другие PHP скрипты с этого сайта» всегда можно найти здесь. Где взять платные и бесплатные прокси сервера, можно найти здесь.

Комментариев нет:

Отправить комментарий