PHP正确地在Windows上的Xampp中获取“Ap​​plication Root”

时间:2010-05-09 00:52:59

标签: php xampp wamp

我发现this thread on StackOverflow有关如何从我的网络应用中获取“应用程序根目录”。

但是,该线程中建议的大多数方法很难应用于Windows上的Xampp。说,我有一个“common.php”,它留在我的网络应用程序的app目录中:

/
/app/common.php
/protected/index.php

在我的common.php中,我得到的是这样的:

define('DOCROOT', $_SERVER['DOCUMENT_ROOT']);
define('ABSPATH', dirname(__FILE__));
define('COMMONSCRIPT', $_SERVER['PHP_SELF']);

在我需要/protected/index.php中的common.php之后,我发现了这个:

C:/xampp/htdocs     //<== echo DOCROOT;
C:\xampp\htdocs\comic\app //<== echo ABSPATH
/comic/protected/index.php //<== echo COMMONSCRIPT

所以最麻烦的部分是路径分隔符不是通用的,而且似乎全部 来自$ _SERVER [] asso数组的超全局变量,例如$ _SERVER ['PHP_SELF'],与“调用者”脚本相关,而不是“被调用者”脚本。

似乎我只能依靠dirname(__FILE__)来确保它始终返回common.php文件的绝对路径。

我当然可以解析DOCROOT和ABSPATH中的返回值,然后计算出正确的“应用程序根目录”。例如,我可以比较htdocs之后的部分并用斜杠替换所有反斜杠以获得类似unix的路径

我想知道这是处理这个问题的正确方法吗?如果我在LAMP环境中部署我的Web应用程序怎么办?这种依赖环境的方法会把我炸掉吗?

我已经使用了一些PHP框架,比如CakePHP和CodeIgniter,坦白说,他们只是在LAMP或WAMP上工作,但我不确定他们是如何找到这样一个优雅的解决方案。

非常感谢所有的提示和建议。

1 个答案:

答案 0 :(得分:3)

dirname(__FILE__)是获取路径的常用方法。实际上,如果您的脚本只能在PHP 5.3或更高版本上运行,__DIR__将执行相同的操作,并且输入时间会更短。

我认为你涉及common.php的策略有点多余。对于初学者来说,DOCROOTCOMMONSCRIPT是无用的 - 他们只是复制一些已经全局的数据。 (所有PHP开发人员都知道$_SERVER['PHP_SELF']是什么,但我个人不知道COMMONSCRIPT在没有查找的情况下意味着什么。)

其次,它可能比它的价值更麻烦。比较从/protected/protected2.php获取/protected/protected.php路径的一些不同方法:

ABSPATH . "/../protected/protected2.php";
"protected2.php"
dirname(__FILE__) . "/protected2.php";

所有这些都是有效的,但有些比其他更容易。这只是说明您要求的(获取应用程序根目录)可能并不总是您需要的。所以我想说,没有神奇的道路可以解决你所有的问题。如果您发现自己处于ABSPATH常数可以帮助您的情况,请使用它。

问题的第二部分:正斜杠可以在Windows上运行,甚至可以与反斜杠混合使用。例如:

include("c:\whatever\whatever/something/anything.php");

将在Windows上使用PHP(至少在任何5.0+版本上;不确定4.x)。反斜杠在Unix上不起作用,所以只需要输入正斜杠,你就可以跨平台安全。

如果您正在编写跨平台脚本,则永远不需要在驱动器号中编码。相反,写这样:

include("/whatever/whatever/something/anything.php");

初始/将由PHP在Windows上解释为c:\。 (我不知道如何以跨平台的方式指向不同的驱动器号。)

HTH