【问题标题】:How to detect the shutdown of a php cronjob, when the server reboots当服务器重新启动时,如何检测 php cronjob 的关闭
【发布时间】:2022-01-23 08:26:15
【问题描述】:

在CMS类型应用程序开发的框架内,我使用php的周期脚本,因为我不能使用crontab,不是服务器的管理员。

这个 pseudocronjob 运行良好。不赘述,它看起来像这样:

public function activateCron()
{
    ignore_user_abort(true);
    set_time_limit(0);
    $time_sleep = 600;
    
    
    while ($this->IsStopCron() == 1) {
        sleep($time_sleep);
        exec('php ExecCron.php');
    }
}

然而,问题是如果服务器重新启动,它就会停止。

我认为没有办法自动重新启动它(此外这对我来说似乎不是一个好主意),但我仍然想知道一种检测服务器何时停止的方法,例如自动发送邮件请求服务器管理员重新启动它。

在我的谷歌搜索中,我找到了 register_shutdown_function,但我不确定这是否能解决我的问题或如何解决。无论如何,当我尝试使用它时它没有成功。

谢谢

【问题讨论】:

  • 您是否尝试过创建个人 crontab?除非管理员在“cron.deny”文件中明确禁止这样做,否则应该是可能的。
  • 我不知道我是否有权这样做。老实说,我不太了解 cron ^^ 这可能吗? code.tutsplus.com/tutorials/…
  • 如果你没有权限,系统不会让你。所以你不妨试试看。这是大多数管理员完全忘记的小项目,因此您很可能被允许。

标签: php server cron shutdown


【解决方案1】:

register_shutdown_function 可能不是执行此操作的可靠方法。也许pcntl_signal 可以检测干净的服务器重启,假设系统配置为允许服务有一段时间干净地结束,但如果说崩溃,这仍然无济于事。


我个人认为自动重启它实际上要走的路;当然,PHP 本身并没有为此提供任何机制。

不过,一种可能的解决方法是搭载 Web 请求。这样,当服务器重新启动时,当有人第一次访问您的站点时,它将触发您的代码并(重新)启动 php-cli 进程,就像您在上面的代码中所做的那样。


如果服务器正在运行 linux/systemd(这很常见),可能是另一种选择;看到允许您使用exec('php ExecCron.php'); 启动php-cli 进程,您也可以运行systemctl --user。如果 systemd lingering 在多用户系统上启用,it allows users to define "services" 将在启动时启动(或在特定时间或时间间隔运行;就像 cronjobs 一样)。

【讨论】:

  • 好的,谢谢你的回答,我会这样看的。
  • 确实,通过提出“cron 应该被激活”的请求,并将最后一个 cron 的计时器与当前计时器进行比较,我们检测到 cron 已停止,因此我们可以自动重新启动它一旦第一个访问者来到网站。令人担忧的是,如果没有人来,cron 可能会长时间保持禁用状态,但我的 CMS 的性质意味着这可能会出现问题。 PHP中没有办法检测服务器何时重启?
  • 对于 exec() 它是作为提出问题的一部分,但实际上我不使用它。
  • 有很多方法可以检测到它,但不是在 webrequest 的上下文中。大多数托管服务提供商提供对 cronjobs 和/或 webhook 或基本 ssh shell 或类似机制的访问;在有请求之前,php-fpm 实际上不会读取您的任何代码。 - 虽然我确实想知道,如果没有人可以访问您的网站,那么在停机期间 cronjob 真的很重要吗?肯定没有任何新数据到达,因此没有什么可处理的?
  • cron 允许将来自 API 的天气数据记录在数据库中,然后执行气候学,因此它很重要,并且不需要访问者。
猜你喜欢
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
相关资源
最近更新 更多