我正在寻找一种可持续的解决方案,每隔 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 秒存储数据。
这个解决方案很奇怪,因为我被教导说套接字用于将数据推送到客户端(实时),但我从未见过它们被用来插入数据。
感谢所有帮助。
答案 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。