php.ini 相对路径,相对路径在cron PHP脚本中不起作用

当PHP脚本作为cron任务运行时,相对路径可能导致include或require失败,因为工作目录可能与直接在命令行运行时不同。解决方法包括使用`chdir`改变工作目录至脚本所在目录,或者使用绝对路径。`dirname(__FILE__)`或`$_SERVER['PHP_SELF']`可以帮助确定正确路径。此外,检查PHP配置和环境变量也可能有助于解决问题。
摘要由CSDN通过智能技术生成

相对路径在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';

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值