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';
?
спасибо!
Ответы
Ответ 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