$ _SERVER ['DOCUMENT_ROOT'] не работает в скрипте php, запущенном через cron - PullRequest
25 голосов
/ 20 января 2010

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

Ответы [ 7 ]

64 голосов
/ 20 января 2010

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

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

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

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

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

23 голосов
/ 20 января 2010

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

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

7 голосов
/ 20 января 2010
Нельзя ожидать, что

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

4 голосов
/ 20 мая 2011

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

1 голос
/ 07 апреля 2016

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

<?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__).'/../../');
?>
1 голос
/ 20 января 2012
define('DOCROOT', substr(str_replace(pathinfo(__FILE__, PATHINFO_BASENAME), '', __FILE__), 0, -1));

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

0 голосов
/ 05 августа 2018

У меня была такая же проблема .. И решения, которые я нашел в интернете, не работали с моим веб-сервером cron, поэтому мне нужно было найти другой способ легко изменить этот путь ..

И это в основном не большая проблема, когда у вас есть 1-2 файла cron (можно легко отредактировать путь к файлу при необходимости), но у меня было 20 файлов cron, и когда мне нужно изменить сервер или изменить путь или smt, тогда я должен изменить все эти файлы, измените путь к ним ...

Итак, я нашел по крайней мере для меня отличные решения: я создал один файл path.php в папке cron и скопировал в ту же папку файлы cron, после чего вы можете включить его без ошибок.

И в path.php у меня есть $path = '/server/root/path';

А потом я включаю этот path.php в мои файлы cron (у меня есть 20 файлов cron или около того)

И теперь я использую этот путь $ в моих файлах cron, как показано ниже:

include 'path.php';
include $path.'/includes/db.php';

Теперь, если мне нужно изменить путь, я просто открываю файл path.php , меняю его и все работает.

Надеюсь, я помог кому-то, потому что решения изменили мою жизнь намного проще! Он все еще не идеален, потому что bc perfect будет, когда все будет работать автоматически, но для меня это намного проще, чем в предыдущей системе, поэтому я решил поделиться своим опытом, возможно, я смогу кому-то помочь:)!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...