2017-10-19 1 views
0

これは私のcronjob.phpファイルで、mysqlデータベースにはrow['cronjob']があり、その値はtest1.phpです。これは私のPHPファイルの名前です。 cronジョブが実行されている間、datetime行が現在の時間と同じかそれよりも短い場合に実行する必要があります。 私はwhile-loopを実行してcronjob rowからファイルの名前を取得して、コーンジョブが実行されている現在の時刻と等しいかそれよりも時間が短い場合に実行すると考えました。以下を参照してください:ループがコードに含ま加えることで!エラーなしで実行されることを、最初の行だけがあることを行っている前1つのcronジョブとループを使って複数のPHPファイルを実行する方法

while($row = mysqli_fetch_array($result)){ 
     $detime = strtotime($row['date']); 
     $id = $row['id']; 
     $phpfile = $row['cronjob']; 

      if($detime <= time()){ 
        include $phpfile; 
        $sql2 = "UPDATE my-table SET cronstatus = 1 WHERE id = $id "; 
        $result2 = mysqli_query($conn, $sql2); 
      } 
    } 

は、しかし、私は(とすぐinclude $phpfile;が含まれるようにエラーWarning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, booleanを持っています実行中(エラーがある間!)、while-loopはその仕事をしません。現在のものとdatetimeを比較して、x-minuteごとに実行されるcronジョブを使用して、すべてのPHPファイルを実行する最良の方法は何ですか?時間? 正しいコードを書き留めていただければ幸いです。

答えて

0

以下のファイル構造を考えてみましょう。

  • /ジョブ
  • /jobs/JobInterface.php
  • /jobs/MyFirstJob.php
  • /jobs/MySecondJob.php
  • /ジョブ/ < ..複数のジョブ..>
  • /cron.php

ジョブがJobInterface.phpで見つかったinterfaceを実装するクラスが含まれているフォルダ内の仕事で終わる各ファイル。このインタフェースでは、すべてのジョブに「実行」メソッドが必要です。

autoloadingのいずれかを使用するか、cron.phpの上部にジョブフォルダのすべてのファイルを手動で含めるだけです。これは実行するファイルです。

データベースの「cronjob」フィールドに、ファイルの名前ではなくジョブの名前(クラス名)が表示されます。

$job_class_name = $row['cronjob']; 
if (false === class_exists($job_class_name)) throw new Exception("No such job"); 
$job = new $job_class_name; 
if (false === $job instance JobInterface) throw new Exception("Not a job"); 
$job->run(); // since the interface requires all jobs to have this method 
関連する問題