如何通过一个 cron 作业和一个循环执行多个 php 文件



这是我的cronjob.php文件,在mysql数据库中,我有一个row['cronjob'],它的值是test1.php,这只是我的一个php文件的名称,当日期时间行等于或小于当前时间时需要执行,而cron作业运行。我想我可以做一个while-loop然后从cronjob row中获取文件名,然后在日期时间等于或小于玉米作业运行时的当前时间时执行它。请看下面:

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错误(在此之前循环运行没有错误!通过在代码中添加 include,只会执行第一行(当存在错误时!),并且 while-loop 不会完成其工作。使用一个 cron 作业执行我的所有 php 文件的最佳方法是什么,该作业根据检查日期时间与当前时间每 x 分钟运行一次?如果您能写下正确的代码,请不胜感激!

我建议你稍微改变一下策略。请考虑以下文件结构:

  • /工作
  • /
  • jobs/JobInterface.php
  • /
  • jobs/MyFirstJob.php
  • /
  • jobs/MySecondJob.php
  • /
  • jobs/<.. 更多工作 ..>
  • /cron.php

在 jobs 文件夹中以 Job 结尾的每个文件都包含一个类,该类实现在 JobInterface.php 中找到的接口。此接口要求所有作业都具有"运行"方法。

然后,您可以使用自动加载,或者只需在 cron.php 顶部手动包含作业文件夹中的所有文件,这仍然是您运行的文件。

在数据库的"cronjob"字段中,您将拥有作业的名称(.class即名称),而不是文件名。

$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

最新更新