这是我的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