PHP: Требуется путь не работает для задания cron? - PullRequest
23 голосов
/ 25 июня 2010

У меня есть задание 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';

спасибо!

Ответы [ 6 ]

26 голосов
/ 25 июня 2010

Технически видно, что скрипт php запускается там, где расположен 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';
25 голосов
/ 25 июня 2010

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

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

// 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 голосов
/ 27 марта 2019

При всем уважении ко всем текущим ответам, все они пошли на «изменение 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
0 голосов
/ 03 сентября 2017

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

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

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

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

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

и т.

0 голосов
/ 25 июня 2010

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

0 голосов
/ 25 июня 2010

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

...