Извлечение данных практически в реальном времени из внешнего API

Я ищу устойчивое решение для получения данных каждый Икс секунд (скажем, 20) и сохранить его в реляционной базе данных с использованием PHP. После некоторых исследований я нашел несколько вариантов:

1) Cronjobs (со скриптами оболочки)

Увидеть https://askubuntu.com/questions/800/how-to-run-scripts-every-5-seconds для дополнительной информации. Это в основном сводится к запуску сценария оболочки (looping / sleep)

Это не правильно, так как я не могу поймать исключения и / или могут возникнуть условия гонки. Кроме того, сами cronjobs не предназначены для такого рода задач.

2) Веб-работник (с работами в очереди)

Laravel обеспечивает работник очереди который может обрабатывать новые задания (асинхронно), когда они помещаются в очередь. Я мог бы отправить несколько (скажем, много) заданий одновременно в очередь, которая должна обрабатываться каждый Икс секунд подряд.

Это звучит как более надежное решение, так как я могу перехватывать исключения и следить за тем, чтобы рабочий работал (используя наблюдателей). Обратная сторона; это медленнее, и это может быть слишком сильным.

3) Веб-сокет

Я мог бы использовать node.js для запуска клиента websocket, как socket.io и реализовать какой-то механизм синхронизации для хранения данных каждый Икс секунд.

Это решение кажется странным, так как меня учили, что сокеты используются для передачи данных клиентам (в реальном времени), но я никогда не видел, чтобы они использовались для вставки данных.


Вся помощь приветствуется.

1

Решение

То, что вы ищете ремесленные команды.

Вы начнете с создания команды:

php artisan make:command FetchData

Это создает FetchData учебный класс. В этом классе вы можете редактировать handle функция.

public function handle()
{
//fetch your data here
}

Вам также нужно отредактировать $signature переменная.

protected $signature = 'fetch:data';

Следующим шагом является регистрация команды в Kernel.php в пространстве имен консоли.
Вы должны добавить свой недавно созданный FetchData класс к $commands массив.

protected $commands = [
Commands\FetchData::class
];

Теперь вы можете вызвать эту команду из консоли, как php artisan fetch:data

После того, как вы зарегистрировали свою команду в Kernel.php вы можете график эта команда.

Вы начинаете с добавления следующей строки в ваш crontab на вашем сервере (введите crontab -e)

* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1

Теперь вы можете добавить следующую команду к schedule функция в Kernel.php:

$schedule->command('fetch:data')->everyThirtyMinutes();

Задание не запускается каждые двадцать минут, поэтому в этом примере я выбрал тридцать минут. Вы можете проверить доступные варианты Вот.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]