Как определить что PHP скрипт запущен по CRON или вручную

Категория: PHP

Несколько способов узнать, что php-скрипт запущен/выполняется по crontab job.

1. Самый надежный способ, это внутри crontab файла явно определить переменную:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/var/www/your-project/bin
SOME_PROJECT_WORK_DIR="/var/www/your-project"
IS_CRON=true

*   *   *   *   *      cd "$OME_PROJECT_WORK_DIR" && php artisan schedule:run >> /dev/null 2>&1
0  */2  *   *   *      cd "$OME_PROJECT_WORK_DIR" && flock -w 0 ./cron-some-job.lock ./cron-some-job.sh >> ./cron-some-job.log 2>&1

И проверять внутри скрипта:

$isCli  = (php_sapi_name() === 'cli');
$isCron = ($isCli && isset($_SERVER['IS_CRON']));
if ($isCron) {
    echo "Скрипт запущен по CRON'у\n";
}

2. Неявный способ. При запуске скриптов по CRON, обычно внутри скрипта доступно очень мало переменных окружения $_ENV. Часто, имеется только 1 переменная:

[SHELL_VERBOSITY] => 0

Если нужен универсальный способ и нет возможности редактировать crontab - можно проверять количество $_ENV переменных:

$isCli  = (php_sapi_name() === 'cli');
$isCron = ($isCli && count(array_keys($_ENV)) < 5);
if ($isCron) {
    echo "Скрипт запущен по CRON'у\n";
}

Метод для копи/паста:

protected function isCron()
{
    return (php_sapi_name() === 'cli' && isset($_SERVER['IS_CRON']));
}

Если знаете другой способ, как определить что скрипт запущен по cron'у - предлагайте.

#php, #cron, #crontab, #cli

категория: PHP