从外部API获取近实时数据

时间:2018-01-30 23:11:16

标签: php shell laravel-5 cron web-worker

我正在寻找一种可持续的解决方案,每隔 x 秒获取数据(假设为20),并使用PHP将其存储在关系数据库中。在做了一些研究后,我发现了一些选择:

1)Cronjobs(使用shell脚本)

有关详细信息,请参阅https://askubuntu.com/questions/800/how-to-run-scripts-every-5-seconds。这基本上归结为运行shell脚本(循环/休眠)

这感觉不对,因为我无法捕捉异常和/或竞争条件可能发生。此外,cronjobs本身并不是为这类任务而制作的。

2)网络工作者(排队的工作)

Laravel提供了queue worker,可以在推送到队列时处理新作业(异步)。我可以一次将多个(比如很多)作业推送到队列中,这应该连续每隔 x 秒处理一次。

这听起来像一个更强大的解决方案,因为我可以捕获异常并确保工作正在运行(使用观察者)。不足之处;它速度较慢,而且可能过度工程化。

3)网络插座

我可以使用node.js运行像socket.io这样的websocket客户端,并实现某种计时机制,每隔 x 秒存储数据。

这个解决方案很奇怪,因为我被教导说套接字用于将数据推送到客户端(实时),但我从未见过它们被用来插入数据。

感谢所有帮助。

1 个答案:

答案 0 :(得分:0)

您要找的是artisan commands

首先要创建一个命令:

php artisan make:command FetchData

这会创建一个FetchData类。在本课程中,您可以编辑handle函数。

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

您还需要编辑$signature变量。

protected $signature = 'fetch:data';

下一步是在Console名称空间中的Kernel.php中注册该命令。 您需要将新创建的FetchData类添加到$commands数组。

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

您现在可以从控制台调用此命令,例如php artisan fetch:data

Kernel.php中注册命令后,您可schedule执行此命令。

首先将以下行添加到服务器上的crontab(键入crontab -e)

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

您现在可以将以下命令添加到schedule

中的Kernel.php功能
$schedule->command('fetch:data')->everyThirtyMinutes();

每20分钟没有工作选项,所以在这个例子中我选择了30分钟。您可以查看可用选项here