如何在 laravel 中构建文件处理
How to architecture file processing in laravel
我的任务是观察文件来自 SFTP 的文件夹。文件很大,处理一个文件比较耗时。我正在寻找最好的方法来做到这一点。这里有一些想法如何做到这一点,但我不确定什么是最好的方法。
- 运行 调度程序每 5 分钟检查一次新文件
- 对于每个有新文件的新文件触发事件。
- 创建将侦听此事件并使用队列的侦听器。在新文件的侦听器中,复制处理文件夹中的新文件并对其进行处理。当新文件的处理开始时,在数据库中插入记录并处理状态。处理完成后更改记录状态并将文件复制到已处理的文件夹。
在这个解决方案中,我对每个文件进行了 2 次复制操作。这是因为如果第二个调度程序在所有文件处理之前执行,那么某些文件可能会在 2 个处理作业中重叠。
最好的方法是什么?我应该使用另一种方法来避免 2 次复制操作吗?比如在调度程序执行期间进行数据库检查以查看文件是否已经处于处理状态?
你应该使用 ->withoutOverlapping();如任务计划程序手册中所述 here。
使用它,您将确保在任何给定时间只有一个任务实例 运行。
我的任务是观察文件来自 SFTP 的文件夹。文件很大,处理一个文件比较耗时。我正在寻找最好的方法来做到这一点。这里有一些想法如何做到这一点,但我不确定什么是最好的方法。
- 运行 调度程序每 5 分钟检查一次新文件
- 对于每个有新文件的新文件触发事件。
- 创建将侦听此事件并使用队列的侦听器。在新文件的侦听器中,复制处理文件夹中的新文件并对其进行处理。当新文件的处理开始时,在数据库中插入记录并处理状态。处理完成后更改记录状态并将文件复制到已处理的文件夹。
在这个解决方案中,我对每个文件进行了 2 次复制操作。这是因为如果第二个调度程序在所有文件处理之前执行,那么某些文件可能会在 2 个处理作业中重叠。
最好的方法是什么?我应该使用另一种方法来避免 2 次复制操作吗?比如在调度程序执行期间进行数据库检查以查看文件是否已经处于处理状态?
你应该使用 ->withoutOverlapping();如任务计划程序手册中所述 here。 使用它,您将确保在任何给定时间只有一个任务实例 运行。