【问题标题】:Javascript alternative to CronJobCronJob 的 Javascript 替代品
【发布时间】:2012-06-13 03:38:40
【问题描述】:

是否有任何 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 分钟以上才能完成(例如删除和重新填充具有数千行的数据库表)

  • 安全吗?
  • 是否应该将“异步”值设置为 false?
  • 我知道可能存在必须同时执行的作业的情况,如果我将异步设置为 false,则每个作业都需要等待完成前一个作业等,因此我需要将 setTimeout 值设置为所有作业的总最大运行时间。
  • 如果我将其设置为 true 会发生什么情况?我担心的是,如果一个作业不能在 setTimeout 间隔之前完成,它的 next_run 将不会被设置,它会自动重新执行。那么我应该在 ajax 调用之前设置 next_run 值吗?

回到主题,我需要做所有这些吗?有更好的解决方案或库吗? (我用谷歌搜索但找不到任何有用的东西。)

谢谢

【问题讨论】:

  • setInterval(fun_here,30000); ? stackoverflow.com/questions/4695629/…
  • 是的,我在发布这个问题之前看到了它,但不幸的是它不能解决我的问题。
  • 我很想知道这是否可行......但我更想知道为什么你的老板似乎如此反对使用 cron:一个可靠的、现成的工作调度器。特别是因为您提到您将执行诸如 db 截断/插入等服务器端操作。似乎他正在为您编织一个痛苦的世界:o
  • “我的老板不想再使用 CronJob 进行日常执行”——真是个坏主意
  • 如果您分享这个决定背后的不幸原因,也许我们可以提供解决方案。

标签: php javascript jquery cron


【解决方案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;

这基本上将每个作业的执行序列化。

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

【讨论】:

  • @ThiefMaster 这也取决于$.ajax 全局设置,所以我总是要求确保:) 顺便说一句,祝你选举顺利,你做得很好!
  • 实际上它已经使用了 3 天 :D 我已经在服务器机器上运行了这段代码(使用 async: false 。这有点慢代码但更安全)到目前为止运行良好。我相信时机成熟时它会爆炸,但我已经警告过公司。无论如何,我不敢相信我写下了一个 javascript 任务调度程序。我不确定这是成功还是失败 :D 感谢您的建议,这确实是一个好主意。也许我会在维护时间到来时应用它。
猜你喜欢
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 2019-07-31
  • 1970-01-01
相关资源
最近更新 更多