JavaScript替代CronJob的方法

3

有没有JavaScript替代Cronjob的方法?

事实上,我的老板不想再使用CronJob进行每日执行,并告诉我如果我们能用JavaScript代替CronJob就好了。

我编写了一个PHP+JavaScript代码。它基本上从数据库中收集每日任务数据(要执行的.php文件,时间间隔等),并将它们放入一个对象中。

然后,

<script>
    function mainFunc(){    
        for(var i=0; i<sizeOfJobs(); i++){ //traverse in the object
            currentDate = new Date();
            //if any of the jobs execution time has come, execute it           
            if(jobs[i]['next_run'] <= currentDate){ 
                $.ajax({
                    url: jobs[i]['file_location'] ,
                    async: false, //this is another question, look below please
                    success: function(data){
                        //after the finish, set next_run and last_run                   
                        currentDate = new Date();                    
                        jobs[i]['last_run'] = currentDate;
                        var nextRun = new Date();
                        nextRun.setTime(currentDate.getTime() + (jobs[i]['interval'] * 60 * 1000));  
                        jobs[i]['next_run'] = nextRun;                        

                    }
                });            
            }                    
        }
        //repeat

        //currently 10 sec but it will increase according to jobs max runtime        
        setTimeout(mainFunc,10000); 
    } 


        $(document).ready(function(){
            setTimeout(mainFunc,10000);        
        })
</script>

所以,我使用了这段代码。它对基本作业很有效,但会有一些需要花费10分钟以上才能完成的大型作业(比如删除和重新填充数千行的数据库表)

  • 这样做是否安全?
  • 应该将“async”值设置为false还是true?
  • 我意识到可能会有同时执行的作业,如果我将async设置为false,则每个作业都必须等待前一个作业完成等等,因此我需要将setTimeout值设置为所有作业的最大运行时间。
  • 如果我将其设置为true,会发生什么?我的担忧是,如果一个作业不能在setTimeout间隔之前完成,则其next_run将不被设置并且它将自动重新执行。所以我应该在ajax调用之前设置next_run值吗?

回到主题,我需要这样做吗?是否有更好的解决方案或库?(我尝试过谷歌搜索,但找不到有用的内容。)

谢谢。


setInterval(fun_here,30000); 是什么意思?http://stackoverflow.com/questions/4695629/cron-job-but-for-jquery-javascript - Tats_innit
是的,我在发布这个问题之前看到过它,但不幸的是它并没有解决我的问题。 - dhargan
11
我很想知道这是否可行,但更想知道你的老板为什么似乎不愿使用cron:一种可靠、易于使用的作业调度程序,尤其是因为你提到你将执行服务器端操作,如数据库截断/插入等。看起来他似乎让你陷入了困境。:o - Darragh Enright
5
我的老板不想再使用 CronJob 进行每日执行了。真是个坏主意。 - J. Bruni
如果你分享这个决定背后的不幸原因,也许我们可以提供一个解决方案。 - frbry
听起来好像有人应该解雇你的老板。模拟 cronjobs,例如通过 AJAX 请求,通常被称为“穷人版的 cron”,并且在共享主机上用作解决方案,因为您没有真正的 cronjobs。如果可以使用真正的 cronjobs,请不要使用它们,这是一个坏主意。 - ThiefMaster
1个回答

1

首先,以我的专业意见,你的老板有点疯狂 :)

话虽如此,以下是一些改变,可以解决你的担忧:

  1. 创建一个与你的 jobs 数组长度相同的 job_execution_slots 数组; 初始化为 null 值。

  2. 在执行 $.ajax() 之前,检查 job_execution_slots[i] 是否被“占用”(不是 null)。

  3. 当插槽为空时,执行 job_execution_slots[i] = $.ajax({...}) 并确保设置为 async: true; 保留引用还允许您通过停止 AJAX 请求来“终止”作业。

  4. 在 AJAX 完成处理程序中,执行 job_execution_slots[i] = null;

这基本上是按作业序列化执行。

如果这对你有意义,请告诉我;我可以根据需要提供更多详细信息 :)


1
@ThiefMaster 这还取决于$.ajax的全局设置,所以我总是问一下以确保 :) 顺便说一句,祝你选举好运,你做得非常出色! - Ja͢ck
实际上它已经使用了3天:D 我在服务器上运行了这段代码(使用async: false.虽然会使代码变慢,但更安全),目前运行良好。我相信到时候它会崩溃的,但我已经警告了公司。我简直不敢相信我写下了一个JavaScript任务调度程序。我不确定这是一项成就还是失败:D 谢谢你们的建议,这确实是一个好主意。也许当维护时间到来时我会应用它。 - dhargan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接