Я ищу устойчивое решение для получения данных каждый Икс секунд (скажем, 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 и реализовать какой-то механизм синхронизации для хранения данных каждый Икс секунд.
Это решение кажется странным, так как меня учили, что сокеты используются для передачи данных клиентам (в реальном времени), но я никогда не видел, чтобы они использовались для вставки данных.
Вся помощь приветствуется.
То, что вы ищете ремесленные команды.
Вы начнете с создания команды:
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();
Задание не запускается каждые двадцать минут, поэтому в этом примере я выбрал тридцать минут. Вы можете проверить доступные варианты Вот.
Других решений пока нет …