Я использую $_SERVER ['DOCUMENT_ROOT']. "/lib/sft_required.php"; включить файл 'sft_required' в PHP script. Когда я запускаю этот файл с помощью браузера, он отлично работает, но когда я запускаю его как задание задания cron, оно не работает. Кажется, что файл не включен, когда мы запускаем script через cron.
$ _SERVER ['DOCUMENT_ROOT'] не работает в PHP скрипт, проходящем через cron
Ответ 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/
Это означает, что мне не нужно беспокоиться о перемещении моего сценария, поскольку он всегда будет находиться где-то в этой первой дочерней папке.