PHP在不使用SSH /控制台的情况下计划虚拟主机上的任务

时间:2019-05-27 14:42:47

标签: php server pthreads schedule

我有一个php网站,该网站的脚本使用来自外部API的数据对数据库执行更新。脚本本身工作正常,但是我需要定时,以便它每个星期一的2:30 AM执行一次。我正在使用一个无法使用SSH的虚拟主机,也不执行任何形式的命令执行,例如exec()passthru()。我也看过CRON作业,但是我也不能使用它,因为我无权访问控制台。

我发现的另一个选择是使用带有phthreads的线程。但是似乎我需要一个额外的库(PECL)来使用它,但是又因为我不能使用任何控制台,所以无法安装该依赖项。

所以我想到的另一个解决方案是,窃取第一个访问该网站的用户的请求。我知道这不是一个漂亮的解决方案,这就是为什么我想问一下是否还有其他一些我可以安排任务的选项。还是窃取请求是这里的唯一选择?还是我的假设有误?

对我来说,VPS也无济于事。

对不起,我的英语不好,这不是我的母语。

1 个答案:

答案 0 :(得分:0)

一种方法是让访问者触发更新。

  • 这样做的好处是您不会将更新脚本公开。
  • 缺点是,直到第一个用户在星期一的凌晨2点30分以后才访问您的数据库,并且第一个用户必须等待数据库被更新。

将此添加到脚本中:

/**
 * Checks if the database's last update was before 
 * Monday at 02:30
 *
 * @param \DateTime Time of last update.  Must be converted to DateTime object
 * @return boolean
 */
function databaseIsOutOfDate(DateTime $createDate) {

  // find the last Monday at 2:30 am.
  $monday = (new DateTime())->modify('tomorrow')->modify('previous monday')->format('Y-m-d 02:30:00');
  $lastUpdated = $createDate->format('Y-m-d H:i:s');

  return ($lastUpdated < $monday);
}

$date_time_from_database = '2019-05-27 02:30:00'; // this date value comes from your database
$last_updated = new DateTime($date_time_from_database);  

if(databaseIsOutOfDate($last_updated)) {
  print "Updating database, please try again later";
  // trigger your update script
  die; // if you continue, you'll have race condition.
}

print "continue with script";