$ _SERVER не работает в скрипте php, проходящем через cron

Я использую $ _SERVER ['DOCUMENT_ROOT']. "/ Lib / sft_required.php"; для включения файла 'sft_required' в скрипт PHP. Когда я запускаю этот файл с помощью браузера, он отлично работает, но когда я запускаю его как задание задания cron, оно не работает. Кажется, что файл не включен, когда мы запускаем скрипт через cron.

Предполагая, что вы запускаете скрипт непосредственно через cron (в отличие от веб-сервера, к которому обращается HTTP-запрос, инициированный cronjob (например, cron running wget)), тогда, конечно, это не сработает.

Нет сервера, поэтому $_SERVER не установлен.

вы можете заполнить $ _SERVER ['DOCUMENT_ROOT'] самостоятельно

 $_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__); 

если файл cron находится в корневом каталоге документа

 $_SERVER['DOCUMENT_ROOT'] = dirname(dirname(__FILE__)); 

если файл cron – это один каталог над корнем документа

Ожидается, что $_SERVER не будет содержать никаких нормальных значений при запуске PHP-скрипта с использованием интерпретатора CLI. Либо поместите путь в переменную среды, либо передайте его сценарию в качестве аргумента командной строки.

Я ответил на аналогичный вопрос. Как отмечали люди, сверхбольшой $ _SERVER не определен в ситуациях с CLI. В ссылке есть (до сих пор) надежный способ получения местоположения DOCUMENT_ROOT. Надеюсь, это окажется полезным.

 define('DOCROOT', substr(str_replace(pathinfo(__FILE__, PATHINFO_BASENAME), '', __FILE__), 0, -1)); 

Это даст вам те же данные, что и $_SERVER['DOCUMENT_ROOT'] для cronjobs.

Пример 1:
/var/www/site.com/ – DOCUMENT_ROOT;
/var/www/site.com/ cron /script.php – скрипт CRON PHP;

 <?php /** DOCUMENT_ROOT -> /var/www/site.com/ */ $_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__).'/../'); ?> 

Пример 2:
/var/www/site.com/ – DOCUMENT_ROOT;
/var/www/site.com/ sub_dir / cron /script.php – скрипт CRON PHP;

 <?php /** DOCUMENT_ROOT -> /var/www/site.com/ */ $_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__).'/../../'); ?>