PHP 可以检测它是从 cron 作业还是从命令行运行?

2022-08-30 09:17:42

我正在寻找PHP方法来检测脚本是否从shell上的手动调用中运行(我登录并运行它),或者它是否从crontab条目运行。

我有各种用php编写的维护类型脚本,我已将其设置为在我的crontab中运行。偶尔,我需要提前手动运行它们,或者如果某些东西失败/损坏,我需要运行几次。

这样做的问题是,我还在任务中设置了一些外部通知(发布到twitter,发送电子邮件等),我不想在每次手动运行脚本时发生这些通知。

我使用的是php5(如果重要的话),这是一个相当标准的Linux服务器环境。

有什么想法吗?


答案 1

无需检测脚本何时从 crontab 运行,而是在手动运行时检测可能更容易。

从命令行运行脚本时设置了许多环境变量(在 $_ENV 数组中)。这些内容将根据您的服务器设置和登录方式而有所不同。在我的环境中,手动运行脚本时设置了以下环境变量,而从 cron 运行时这些变量不存在:

  • 术语
  • SSH_CLIENT
  • SSH_TTY
  • SSH_CONNECTION

还有其他的。例如,如果您始终使用SSH访问该框,则以下行将检测脚本是否正在从cron运行:

$cron = !isset($_ENV['SSH_CLIENT']);


答案 2
if (php_sapi_name() == 'cli') {   
   if (isset($_SERVER['TERM'])) {   
      echo "The script was run from a manual invocation on a shell";   
   } else {   
      echo "The script was run from the crontab entry";   
   }   
} else { 
   echo "The script was run from a webserver, or something else";   
}

推荐