Skip to content

Instantly share code, notes, and snippets.

@maximal
Created May 25, 2015 12:52
Show Gist options
  • Save maximal/296cad27125e446f8c5a to your computer and use it in GitHub Desktop.
Save maximal/296cad27125e446f8c5a to your computer and use it in GitHub Desktop.
Параллельная работа с длительными задачами и REST API

Параллельная работа с длительными задачами и REST API

Честно говоря, с Инстаграммом не работал никогда (и не зарегистрирован даже), не хочется врать. Но не думаю, что там что-то сильно отличается.

Для примера взял Twitter и всё-таки Gearman.

Процесс-задачник берёт твиттер-аккаунты из базы, ставит задачи на скачку их твитов. Процесс-работник берёт задачи на скачку и скачивает твиты в формате JSON. Просто задача мне близка: я собираю базу твитов белгородских пользователей твиттера, и делаю всякую разную статистику: кто сколько и когда твитит, сколько каких смайликов используется, кто кого фолловит больше всего и прочие бесполезные цифры :-)

Работник анализирует заголовки ответа твиттер-сервера, и если там сказано, что лимит исчерпан, ждёт необходимое количество секунд (указано в ответном HTTP-заголовке X-Rate-Limit-Reset). В консоли при этом выводится сообщение от работника, наподобие такого:

Sleeping for 325 seconds…  To: 14:49:04

Устройство кода

Код представлен в трёх файлах:

  • add-user.php — добавление задачи (пользователя);
  • get-tweets.php — выполнение задачи (получение твитов);
  • config.php — общие настройки.

Каталоги:

  • lib/ — библиотека для доступа к REST API Твиттера;
  • data/ — скачанные твиты.

Код максимально изолирован от всех фреймворков преднамеренно, чтобы быть более «скриптовым». Обычно используется Yii2 и Composer, конечно. Из зависимостей только пакеты, перечисленные ниже для установки. Версия PHP ≥ 5.4.

Всё работает многопоточно, можно запускать несколько задачников и несколько работников.

В терминах Инстаграм-задачи: задачник — получение списка фоток для лайканья, работник — лайканье. Если нужно прям Инстаграм-Инстаграм, нужно будет денёк-пару поразбираться в документации, но я, откровенно говоря, не особо верю, что там что-то сверхъестественное.

Настройки авторизации к REST API находятся в файле config.php. Если нужно авторизовываться из разных приложений прописываем разные настройки в разных настроечных файлах и запускаем работников.

Как потестировать

Распаковать архив в рабочий каталог.

Поставить нужные пакеты:

sudo apt-get install php5 gearman-job-server php5-gearman php5-curl

Поставить задачи на выполнение (желательно выбрать большое количество многопишущих пользователей):

php add-user.php almaximal sijeko OldLentach …

Запустить сколько угодно работников:

php get-tweets.php

При желании можно зарегистрировать разные приложения для расширения лимитов и запустить несколько работников с разными конфигами:

// Доступ к приложению OAuth
// Можно делать много разных приложений для расширения лимитов
$oauthParams = [
	'consumer_key'    => '…',
	'consumer_secret' => '…',
	'user_token'      => '…',
	'user_secret'     => '…',
];

Точно так же можно создать несколько серверов очередей задач и запускать работников на разных серверах.

Примерный вывод задачника

% php add-user.php sijeko almaximal
Adding user: sijeko
Adding user: almaximal

Примерный вывод работников

# Первый работник
% php get-tweets.php
Getting tweets for user @almaximal    (queued at 2015-05-25T15:02:31+03:00)…
	Getting tweet: https://twitter.com/almaximal/status/602634163041259520 …
	…
	Getting tweet: https://twitter.com/almaximal/status/516967868010078208 …
		Sleeping for 325 seconds…  To: 15:15:04
	Getting tweet: https://twitter.com/almaximal/status/516945702229123072 …
	…
	Getting tweet: https://twitter.com/almaximal/status/304884802375516161 …
	Job done.
…

# Второй работник
% php get-tweets.php
Getting tweets for user @sijeko    (queued at 2015-05-25T15:02:31+03:00)…
	Getting tweet: https://twitter.com/sijeko/status/602084404131930112 …
	…
	Getting tweet: https://twitter.com/sijeko/status/88199752516243456 …
	Job done.
…

/**
 * Параллельная работа с длительными задачами и REST API
 *
 * @author MaximAL
 * @date 2015-05-25
 * @version 1.0
 * @since 2015-05-25 Первая версия документа.
 * @copyright © MaximAL 2015
 **/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment