我有requires地址$_SERVER['DOCUMENT_ROOT'].'/subdir/file.php';
首先 - 这是包含事物的最佳方式吗?显然我不想使用'../../subdir/file.php';
之类的路径,因为移动文件会破坏它。
但另一个有趣的问题是,如果我通过命令行运行此文件,则不会创建$_SERVER
。我可以通过$_SERVER['DOCUMENT_ROOT'] = '.';
伪造它,但我很好奇这是否是最好的做法。好像不是。
编辑:显然有很多方法可以为这只猫设置皮肤,尽管我认为最佳做法是定义一个负责include目录的变量(或常量)。如:
define('INC_DIR', $_SERVER['DOCUMENT_ROOT'].'/../includes');
或
if (PHP_SAPI == 'cli') {
$_includes = '../includes';
} else {
$_includes = $_SERVER['DOCUMENT_ROOT'].'/../includes/');
}
在整个代码中使用上述变量或常量。
答案 0 :(得分:2)
我更喜欢在我的架构中使用文件夹定义系统。像这样:
define( 'DIR_ROOT',dirname(__FILE__) );
在命令行和Web模式下均可使用。在应用程序入口点(大多数情况下为index.php)中使用它,然后从该文件向外加载框架的其余部分。应用程序的所有入站调用都应通过.htaccess或其他方法进行路由,以便它们调用index.php?foo = bar等。
我也讨厌一直输入DIRECTORY_SEPARATOR所以我通常会做出第一个定义:
define( 'DS' , DIRECTORY_SEPARATOR );
这使您以后可以执行以下操作:
require_once( DIR_ROOT.DS.'myfolder'.DS.'myfile.class.php' );
答案 1 :(得分:0)
或者,如果您不想或不需要修改您的php文件而您只需要正常执行的页面,则可以使用curl
。大多数Linux和Unix系统都安装了它。
$ curl http://www.example.com/myscript.php &> /dev/null
&> /dev/null
部分将输出发送到系统中的黑洞,因此您不必查看请求返回的HTML。
答案 2 :(得分:0)
if(PHP_SAPI == 'cli')
{
$_SERVER['DOCUMENT_ROOT'] = '/path/to/webroot';
}