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

PHP: Требовать, чтобы путь не работал для работы cron?

У меня есть задание cron, которое должно включать этот файл:

require '../includes/common.php';

однако, когда он запускается через задание cron (а не мое локальное тестирование), относительный путь не работает. задание cron запускает следующий файл (на реальном сервере):

/home/username123/public_html/cron/mycronjob.php

и здесь ошибка:

Fatal error: require(): Failed opening required '../includes/common.php' 
(include_path='.:/usr/lib/php:/usr/local/lib/php') in 
/home/username123/public_html/cron/mycronjob.php on line 2

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

/home/username123/public_html/includes/common.php

означает ли это, что я должен заменить свою строку 2:

require '/home/username123/public_html/includes/common.php';

?

спасибо!

4b9b3361

Ответ 1

Технически видно, что php script запускается там, где находится cron; ех. Если cron был в /bin/cron, то это утверждение будет искать common.php в /bin/includes/common.php.

Итак, вам, вероятно, придется использовать fullpaths или использовать set_include_path

set_include_path('/home/username123/public_html/includes/');
require 'common.php';

Ответ 2

нет нет. вам нужно использовать абсолютные пути на кронах.

что я делаю это:

// supouse your cron is on app/cron and your lib is on app/lib
$base = dirname(dirname(__FILE__)); // now $base contains "app"

include_once $base . '/lib/db.inc';

// move on

Ответ 3

Если относительный путь не работает, то это означает, что текущий каталог, заданный при выполнении задач cron, не является /home/username 123/public_html. В таких случаях вы можете использовать только абсолютный путь.

Ответ 4

Это звучит так же просто, как только некоторые script, которые вы запускаете, устанавливают include_path, и вы включаете это script. используйте phpinfo(), чтобы проверить глобальную локальную настройку include_path.

Ответ 5

Альтернативой решениям, рекомендующим спецификацию абсолютного пути, является chdir в вашем script. Таким образом, ваши относительные пути будут работать должным образом.

Например, чтобы перейти в каталог script:

$curr_dir = dirname(__FILE__);
chdir($curr_dir);

Чтобы перейти в родительский каталог script:

$curr_dir = dirname(__FILE__);
chdir($curr_dir . "/..");

И так далее.

Ответ 6

При всем уважении ко всем текущим ответам, они все пошли, чтобы "изменить код php" подход.

Я не люблю менять свои PHP файлы только для того, чтобы запускать их из cron потому что это уменьшает переносимость кода и увеличивает шансы забыть изменить один или два относительных пути и сломать программу.

Вместо этого измените каталог в строке вкладки cron и оставьте все ваши относительные пути и ваши PHP файлы без изменений. Например

1 1 * * * cd /home/username/public_html/&& php -f script.php

проверьте этот ответ

Также проверьте эту статью, я процитирую относительную часть

В зависимости от кода в вашем PHP-скрипте, он может работать правильно только при вызове из определенного каталога. Например, если сценарий использует относительные пути для включения файлов, он будет работать только в том случае, если он вызывается из правильного каталога. Следующая команда показывает, как вызвать скрипт PHP из определенного каталога:

cd /home/username/public_html/; php -q script.php