3

Cronjobに代わるJavaScriptはありますか?

問題は、私の上司はCronJobを毎日の実行に使用したくないということであり、CronJobの代わりにjavascriptを使用してそれを実行できるかどうかを教えてくれました。

私は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に設定する必要がありますか?
  • 同時に実行する必要のあるジョブが存在する可能性があることを認識しており、async falseを設定すると、すべてのジョブが前のジョブの終了などを待機する必要があるため、setTimeout値を合計最大実行時間に設定する必要がありますすべての仕事の。
  • 私がそれを真実に設定した場合、それは何が起こる可能性がありますか?私が恐れているのは、setTimeout間隔の前にジョブを終了できない場合、next_runは設定されず、自動的に再実行されることです。では、ajax呼び出しの前にnext_run値を設定する必要がありますか?

メイントピックに戻ると、これをすべて行う必要がありますか?より良い解決策やライブラリはありますか?(私はグーグルで検索しましたが、有用なものは何も見つかりませんでした。)

ありがとうございました

4

1 に答える 1

1

まず第一に、私の専門家の意見では、あなたの上司は頭がおかしいです:)

そうは言っても、恐れに対処するためにできる変更は次のとおりです。

  1. job_execution_slots配列と同じ長さの配列を作成しますjobs。値に初期化しnullます。

  2. 行う前に、が「取得」され$.ajax()ているかどうかを確認します(取得されていない)。job_execution_slots[i]null

  3. スロットが空の場合は、;job_execution_slots[i] = $.ajax({...})に設定されていることを確認してください。async: true参照を保持すると、AJAXリクエストを停止してジョブを「強制終了」することもできます。

  4. AJAX完了ハンドラーでjob_execution_slots[i] = null;

これは基本的にジョブごとの実行をシリアル化します。

これがあなたにとって意味があるかどうか私に知らせてください。必要に応じて詳細を提供できます:)

于 2012-06-15T13:01:35.687 に答える