2011-08-10 229 views
0

网络的意图PHP代码我有PHP代码,按地址$_SERVER['DOCUMENT_ROOT'].'/subdir/file.php';从命令行运行

首先,requires其他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/'); 
} 

并使用整个代码前述变量或常数。

回答

2

我更喜欢在我的架构中使用文件夹定义系统。类似这样的:

define('DIR_ROOT',dirname(__FILE__)); 

在命令行和Web模式下都可以使用。在你的应用程序入口点(大多数情况下使用index.php)使用它,然后从该文件中向外加载框架的其余部分。您的应用程序的所有接听电话应通过的.htaccess或其他方法进行路由,让他们打电话的index.php富=酒吧等

我也很讨厌打字DIRECTORY_SEPARATOR所有的时间,所以我通常做的第一个定义:

define('DS' , DIRECTORY_SEPARATOR); 

这使你以后做这样的事情:

require_once(DIR_ROOT.DS.'myfolder'.DS.'myfile.class.php'); 
0

另外,如果你不想或者需要修改你的php文件,并且你只需要一个正常执行的页面,你可以使用curl。大多数Linux和Unix系统都安装了它。

$ curl http://www.example.com/myscript.php &> /dev/null 

&> /dev/null部分输出发送到系统中的一个黑洞,所以你不必看这是由请求返回的HTML。

0
if(PHP_SAPI == 'cli') 
{ 
    $_SERVER['DOCUMENT_ROOT'] = '/path/to/webroot'; 
}