PHP:需要路径不适用于cron作业?

问题描述 投票:23回答:6

我有一个需要包含此文件的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';

?

谢谢!

php include cron require absolute-path
6个回答
26
投票

从技术上看,php脚本是在cron所在的位置运行的;恩。如果cron在/ bin / cron中,则此语句将在/bin/includes/common.php中查找common.php。

所以,是的,你可能不得不使用完整路径或使用set_include_path

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

25
投票

不,不。你需要在crons上使用绝对路径。

我所做的是:

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

一切都尊重所有当前的答案,他们都去“改变PHP代码”的方法。

我不喜欢改变我的PHP文件只是为了从cron运行它,因为它降低了代码的可移植性并增加了忘记更改一个或两个相对路径并破坏程序的机会。

而是更改cron选项卡行中的目录,并保持所有相对路径和PHP文件不变。例如

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

检查this answer

还检查this article,我会引用相关部分

根据PHP脚本中的代码,它可能只在从特定目录调用时才能正确运行。例如,如果脚本使用相对路径来包含文件,则只有在从正确的目录调用它时才会运行。以下命令显示如何从特定目录调用PHP脚本:

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

0
投票

如果相对路径不起作用,则表示当cron任务运行时设置的当前目录不是/ home / username123 / public_html。在这种情况下,您只能使用绝对路径。


0
投票

这听起来就像你正在运行的一些脚本设置include_path并且包含该脚本一样简单。使用phpinfo()检查include_path全局与本地设置。


0
投票

推荐绝对路径规范的解决方案的替代方案是在脚本中使用chdir。这样,您的相对路径将按预期工作。

例如,要更改到脚本的目录:

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

要更改为脚本的父目录:

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

等等。

© www.soinside.com 2019 - 2024. All rights reserved.