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

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

многопоточный сбор 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

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

Выводы

Запустив на сбор этот код мы собираем 45 запросов где-то за 55 сек. Т.е примерно в 3 раза быстрее для 5 потоков, по сравнению со сбором в один поток, зависимость тут не линейная, но очень близкая к ней. Таким образом чем большее количество потоков мы запускаем тем выше у нас скорость. Но тут большую роль играет качество и скорость прокси серверов. Т.е на каждый поток нужно как минимум 30-60 хороших прокси , чтобы было как можно меньше неудачных запросов для каждого прокси. И тут еще лучше всего воспользоваться платными прокси серверами,  но также есть несколько вариантов как улучшить работу скрипта не прибегая к платным прокси серверам. Это следующее :

  • Увеличение эффективности использования прокси
  • Оптимизация узких мест скрипта
  • Работа через TOR и другие анонимайзеры
  • Создание своих прокси серверов на VPS
  • Использование VPN

И об этом я расскажу в следующих статьях.  Кроме того в процессе работы у нас уже получилось достаточно много кода. В следующем посту я оптимизирую этот код, заодно покажу основные принципы оптимизации и проектирования для сбора данных на PHP. Ну и как всегда напоследок я даю ссылки на материалы на x-scripts.com касательно этого скрипта.

Материалы

Весь исходный код по этой статье можно скачать здесь. Руководство «Как запустить этот и другие PHP скрипты с этого сайта» всегда можно найти здесь. Где взять платные и бесплатные прокси сервера, можно найти здесь.

Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс
Опубликовано в PHP, Использование Web API, Обучение Метки: , , , , ,
Сентябрь 2021
Пн Вт Ср Чт Пт Сб Вс
« Фев    
 12345
6789101112
13141516171819
20212223242526
27282930