PHP: Require path не работает для задания 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';

?

спасибо!

5 ответов


технически видно, что скрипт php запускается там, где находится cron; ex. Если cron был в /bin / cron, то это утверждение будет искать общее.php в /bin/включает/общий.РНР.

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

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

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

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

// 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

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


Это звучит так просто, как только какой-то скрипт, который вы запускаете, устанавливает include_path, и вы включаете этот скрипт. используйте phpinfo (), чтобы проверить параметр include_path global vs local.


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

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

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

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

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

и так далее.