Php 我们如何允许用户在Laravel中从前端设置cron作业?

Php 我们如何允许用户在Laravel中从前端设置cron作业?,php,laravel,cron,scheduling,cron-task,Php,Laravel,Cron,Scheduling,Cron Task,我的laravel应用程序中有一个设置部分。在本节中,我有一个定义同步时间的设置。因此,用户可以设置将数据从laravel应用程序同步到第三方CRM(Salesforce)的首选时间 现在,我将同步时间存储到数据库表中。现在我想在那个时候为一个特定的用户运行一个cron作业 我已经创建了一个cron作业脚本,cron作业脚本运行良好。我能够手动测试cron作业,我只需要通过用户设置(首选时间)将其自动化。 我的Cron作业URL 我试着使用laravel,但这不符合我的要求 laravel还有其

我的laravel应用程序中有一个设置部分。在本节中,我有一个定义同步时间的设置。因此,用户可以设置将数据从laravel应用程序同步到第三方CRM(Salesforce)的首选时间

现在,我将同步时间存储到数据库表中。现在我想在那个时候为一个特定的用户运行一个cron作业

我已经创建了一个cron作业脚本,cron作业脚本运行良好。我能够手动测试cron作业,我只需要通过用户设置(首选时间)将其自动化。 我的Cron作业URL

我试着使用laravel,但这不符合我的要求


laravel还有其他更好的解决方案吗?

缺少一些信息,但我尝试假设一些事情,希望使用laravel调度器提出一个可行的解决方案


假设您将CRON在数据库中运行的时间存储为夜间1点钟的
01:00
,您可以执行以下操作:

受保护功能计划(计划$schedule)
{
User::query()->whereNotNull('cron_time')->每个(函数(用户$User)使用($schedule){
$schedule->command('app:import',['user\u id'=>$user->id])
->withoutOverlapping()//防止同时运行同一命令(+参数)两次,只有当命令可以运行>24小时时才应该是问题,但仍然是安全的
->dailyAt($user->cron_time);
});
}
  • 我梦见你将信息存储在用户模型上
  • 您在数据库中使用了一个名为
    cron\u time
    的标志,该标志包含
    01:00
    ,如果禁用了cron,则该标志为
    null
  • cron需要每天在用户提供的时间运行
  • 导入命令称为
    app:import
    ,是一个控制台命令,它接受一个带有用户id的
    user\u id
    参数来运行导入
这可能会帮助您调整上述内容,使其适应您自己的应用程序中的结构


如果要使用排队作业来执行导入,还可以创建
app:import
CLI命令,以仅调度该作业,而不是实际运行导入。根据导入的数量,最好防止长时间运行的调度程序命令,并具有重试和超时的能力



另一个选项还可以是使用每日调度命令,将作业调度到计划在特定时间运行的队列(不适用于SES驱动程序)。有关这方面的更多信息,请参见:。

缺少一些信息,但我尝试假设一些情况,希望使用Laravel调度程序提出一个可行的解决方案


假设您将CRON在数据库中运行的时间存储为夜间1点钟的
01:00
,您可以执行以下操作:

受保护功能计划(计划$schedule)
{
User::query()->whereNotNull('cron_time')->每个(函数(用户$User)使用($schedule){
$schedule->command('app:import',['user\u id'=>$user->id])
->withoutOverlapping()//防止同时运行同一命令(+参数)两次,只有当命令可以运行>24小时时才应该是问题,但仍然是安全的
->dailyAt($user->cron_time);
});
}
  • 我梦见你将信息存储在用户模型上
  • 您在数据库中使用了一个名为
    cron\u time
    的标志,该标志包含
    01:00
    ,如果禁用了cron,则该标志为
    null
  • cron需要每天在用户提供的时间运行
  • 导入命令称为
    app:import
    ,是一个控制台命令,它接受一个带有用户id的
    user\u id
    参数来运行导入
这可能会帮助您调整上述内容,使其适应您自己的应用程序中的结构


如果要使用排队作业来执行导入,还可以创建
app:import
CLI命令,以仅调度该作业,而不是实际运行导入。根据导入的数量,最好防止长时间运行的调度程序命令,并具有重试和超时的能力



另一个选项还可以是使用每日调度命令,将作业调度到计划在特定时间运行的队列(不适用于SES驱动程序)。有关详细信息,请参见:。

为什么
计划安排对您不起作用?因为我们没有预定义的时间,我们允许用户设置自己的同步时间。此外,每次运行cron作业时,它都会同步20条记录,而且可能会有20多条记录。因此,我们需要运行cron作业,直到所有记录未同步,但同步在用户指定的时间开始。这可以通过调度完成。将计划程序设置为每分钟运行一次,并在您的
命令中检查数据库,并确定要执行的作业。为什么
计划程序
不适用于您?因为我们没有预定义的时间,我们允许用户设置自己的同步时间。此外,每次运行cron作业时,它都会同步20条记录,而且可能会有20多条记录。因此,我们需要运行cron作业,直到所有记录未同步,但同步在用户指定的时间开始。这可以通过调度完成。将计划程序设置为每分钟运行一次,并在
命令中检查数据库,确定要执行的作业。1。如果有多个用户具有相同的时间
01:00
,该怎么办?cron作业是否会为每个用户运行?2.我们还需要多次运行同一个cron作业,直到所有数据都不同步。在一次运行中,脚本将同步20条记录,如果有超过20条记录,则需要多次运行cron作业?1。对它将为每个用户运行,因为它为每个用户注册了一个计划作业。然而,阅读是令人沮丧的