Подтвердить что ты не робот

$ _SERVER ['DOCUMENT_ROOT'] не работает в PHP скрипт, проходящем через cron

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

<?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 script;

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

Ответ 7

У меня была такая же проблема.. И решения, которые я нашел в интернете, не работали с моим веб-сервером 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 будет, когда все будет работать автоматически, но для меня это намного проще, чем в предыдущей системе, поэтому я решил поделиться своим опытом, возможно, смогу помочь кому-нибудь :)!

Ответ 8

Вот мое решение для аналогичной проблемы, с которой я столкнулся.

$site_root_directory = substr( __DIR__, 0, strpos( __DIR__, "wp-content" ) );

В моем случае я запускаю cron, который выполняет файл внутри моей темы. (Я не загружаю WordPress для кукурузы, поэтому у меня нет доступа к таким вещам, как ABSPATH).

Таким образом, я получаю свой "корневой каталог", используя первую дочернюю папку внутри корня, ведущую к моему сценарию, вместо того, чтобы вернуться обратно из каталога сценария.

/var/more_directories/public_html/wp-content/themes/theme-name/includes/cron-jobs /var/more_directories/public_html/

Это означает, что мне не нужно беспокоиться о перемещении моего сценария, поскольку он всегда будет находиться где-то в этой первой дочерней папке.