【发布时间】:2021-10-04 17:22:22
【问题描述】:
两天以来我一直在搜索,但找不到合适的方法来做我想做的事!我有一个我想每个月更新的数据库表。因此,我正在使用 Laravel 设计一个 API,并且我想在调用特定函数时每月只执行一次 SQL 语句块。 对于检索表的所有行的索引函数中的实例,我想检查当前日期是否高于列中的日期,如果它在 INDEX 函数中仅执行一次代码,那么当在该函数中再次调用该函数时同一个月根本不执行。我已经编写了数据库操作的逻辑,但是在执行 INDEX 函数时不能只运行一次代码。它继续执行内部的代码块。所以我想知道如何做这样的任务。我看过 CRON Job,但这不是我想要的。我希望在不执行任何命令的情况下完成任务。下面是代码
public function getAllOrder(){
//here executed will be a boolean to record if the function is executed or not.
if(!$executed && $todayDate < "SOMEDATTE"){
//run function under only once//
function createOrder(){
}
}
else{
//no order to be created
}
}
上面的代码只是为了展示我想要的。
【问题讨论】:
-
如果你只想每月运行一次,那么为什么不想使用 cronjob,这将是理想的解决方案?如果你想从索引中调用它,你需要将它的执行状态保存在某个地方(比如在数据库中)并检查每个请求,这似乎是不必要的复杂性。
-
您必须正确设置 Laravel cron 并安排作业。就是这个方法。如果没有 cron,您将需要在每个请求(或某些请求)中运行代码,以检查今天是否是运行作业的日子,并在某处检查作业是否已经完成。但这是在重新发明轮子。
-
@GilesBennett - 也许,但我倾向于避免做出假设,因为这里的许多问题都是 XY 问题。
-
我不知道你的意思是什么“在你的cron作业运行之前,你需要先运行一个命令。你创建的命令”。正如我所说,一个 cron 作业只是一个命令的预定执行,所以不,你不需要在你的 cron 作业之前做任何事情。如果您有要在索引文件中运行的代码,只需将其移动到 Laravel CLI 命令并使用 cron 执行。
-
如果你只是回答为什么你不想执行一个命令而不是向你的索引文件添加一堆复杂的逻辑(这将在每个请求上执行)最有可能对竞争条件开放。第一条评论还提到了您需要实施的流程。你实际尝试过什么?发布的代码看起来只是一些模糊的伪代码,而不是真正的尝试。