相对路径在cron PHP脚本中不起作用
如果将PHP脚本作为cron脚本运行,则如果使用相对路径,则include常常会失败。 例如,如果您有
require_once('foo.php');
在命令行上运行时会找到文件foo.php,但从cron脚本运行时找不到。
一个典型的解决方法是先chdir到工作目录,或使用绝对路径。 但是,我想知道导致此行为的cron和shell之间的区别是什么。 在cron脚本中使用相对路径时,为什么会失败?
Sjoerd asked 2020-02-11T16:13:10Z
8个解决方案
97 votes
将工作目录更改为运行文件路径。 只需使用
chdir(dirname(__FILE__));
include_once '../your_file_name.php'; //we can use relative path after changing directory
在运行文件中。 然后,您无需在每个页面中将所有相对路径更改为绝对路径。
Withfriendship Hiox answered 2020-02-11T16:13:35Z
12 votes
从cron运行时,脚本的工作目录可能不同。 另外,关于PHPs require()和include()的困惑,导致对工作目录确实是问题的困惑:
include('foo.php') // searches for foo.php in the same directory as the current script
include('./foo.php') // searches for foo.php in the current working directory
include('foo/bar.php') // searches for foo/bar.php, relative to the directory of the current script
include('../bar.php') // searches for bar.php, in the parent directory of the current working directory
Sjoerd answered 2020-02-11T16:13:56Z
7 votes
我获得“ require_once”同时使用cron和apache的唯一机会是
require_once(dirname(__FILE__) . '/../setup.php');
jansch answered 2020-02-11T16:14:16Z
5 votes
因为cron作业的“当前工作目录”将是crontab文件所在的目录-因此,任何相对路径都相对于THAT目录。
最简单的处理方法是使用dirname( $_SERVER['PHP_SELF'] )函数和PHP dirname( __FILE__ )常数。 否则,每当您将文件移动到其他目录或具有不同文件结构的服务器时,都需要使用新的绝对路径来编辑文件。
dirname( __FILE__ )
dirname( $_SERVER['PHP_SELF'] )是PHP定义的常量,它是从中调用它的文件的完整路径。 即使包含了文件,dirname( __FILE__ )也将始终引用文件本身的完整路径,而不是引用包含的文件。
因此dirname( $_SERVER['PHP_SELF'] )将完整目录路径返回到包含该文件的目录-不管它从何处包含,并且dirname( __FILE__ )返回文件名本身。
例:让我们假设“ /home/user/public_html/index.php”包括“ /home/user/public_html/your_directory/your_php_file.php”。
如果您在“ your_php_file.php”中调用dirname( $_SERVER['PHP_SELF'] ),即使活动脚本位于“ / home / user / public_html”中,也会返回“ / home / user / public / html / your_directory”(请注意,不要使用斜杠)。
如果需要包含文件的目录,请使用:dirname( $_SERVER['PHP_SELF'] ),该文件将返回“ / home / user / public_html”,并且与“ index.php”文件中的dirname( __FILE__ )调用相同,因为相对路径相同。
用法示例:
@include dirname( __FILE__ ) . '/your_include_directory/your_include_file.php';
@require dirname( __FILE__ ) . '/../your_include_directory/your_include_file.php';
aequalsb answered 2020-02-11T16:15:08Z
3 votes
另一种可能性是CLI版本正在使用其他php.ini文件。 (默认情况下,它将使用php-cli.ini并回退到标准php.ini)
另外,如果您使用.htaccess文件设置您的库路径等,则显然不会通过cli起作用。
John Parker answered 2020-02-11T16:15:33Z
2 votes
除了上面接受的答案,您还可以使用:
chdir(__DIR__);
billynoah answered 2020-02-11T16:15:57Z
1 votes
通过cron作业执行时,与从shell手动启动PHP脚本相比,PHP脚本可能在不同的上下文中运行。 因此,您的相对路径未指向正确的路径。
Jan Hančič answered 2020-02-11T16:16:17Z
0 votes
DIR可以工作,尽管它在我的本地主机上不起作用,因为它的路径与实时站点服务器的路径不同。 我用它来修复它。
if(__DIR__ != '/home/absolute/path/to/current/directory'){ // path for your live server
require_once '/relative/path/to/file';
}else{
require_once '/absolute/path/to/file';
}