9

I need to determine whether the PHP file is being loaded via cron or command line within the code. How can I do this?

Ben
  • 58,238
  • 105
  • 295
  • 471

4 Answers4

16

If you have control over the cron or command, have you considered passing a command-line argument, and reading it with $_SERVER['argv'][0]?

* * * * *   /usr/bin/php /path/to/script --cron

In the script:

<?php
if(isset($_SERVER['argv'][0]) and $_SERVER['argv'][0] == '--cron')
   $I_AM_CRON = true;
else
   $I_AM_CRON = false;
gahooa
  • 122,825
  • 12
  • 91
  • 98
6

The most reliable and exhaustive way to check where your script is run known to me is

php_sapi_name()

Neither this nor any of the other listed methods listed here, however, will give you a distinction between "normal" CLI mode, and a cron call. gahooa's command line argument idea is probably the best and most reliable solution.

Adam Michalik
  • 9,863
  • 12
  • 62
  • 97
Pekka
  • 431,103
  • 135
  • 960
  • 1,075
  • I'm not sure if something has changed in the last several years, but on my system (CentOS 6.6, PHP 5.4.38, running Litespeed), there is a distinction. `php_sapi_name()` returns `cli` when run from the command-line. It returns `cgi-fcgi` when run via cron. – rinogo Mar 05 '15 at 17:45
6

This is one simple way. Certain elements of the $_SERVER array are only set if called from HTTP. Thus you can:

if(!isset($_SERVER['REQUEST_METHOD'])){
 // from cron or command line
}else{
 // from HTTP
}

Others include: $_SERVER['HTTP_HOST']

mauris
  • 41,504
  • 15
  • 94
  • 130
2

You can check the PHP_SAPI constant to check if the CLI interpreter is being used:

$is_cli= PHP_SAPI == 'cli';

leepowers
  • 36,760
  • 23
  • 97
  • 128