在PHP中访问/创建SITE_ROOT和SERVER_ROOT值的最佳方法是什么?

4
我需要两个不同的路径,一个用于文件包含(include),另一个用于js/css等。我正在使用 mod_rewrite。下面的方法可以正常工作...
目前,我的所有文件顶部都包含了这个。
define('SERVER_ROOT',   'C:/wamp/www/site_folder/');
define('SITE_ROOT',     'http://localhost/site_folder/');

然后文件就这样被调用:

require_once SERVER_ROOT . 'st_wd_assets/inc/func_st_wd.php';    

<link rel="stylesheet" type="text/css" href="<?php echo SITE_ROOT;?>st_pages/user_area/css/user_area.css" media="screen"/>

你可能已经注意到,每当我在本地主机和我的生产服务器之间移动版本时,更新每个文件的顶部都将是一项巨大的任务。

定义这些ROOT值的最佳/标准方法是什么?

我在$_SERVER超级全局变量中找不到解决方案?人们通常只是使用虚拟主机吗?但是,是否仍然需要定义ROOT常量?

6个回答

2

是的,人们通常只使用VirtualHosts。

有几种方法:

  • 您可以使用相对路径来包含配置文件。
  • 您可以使用$_SERVER超全局变量中的DOCUMENT_ROOT来放置配置文件。
  • 如果可能的话,您可以使用Web服务器配置,例如在.htaccess文件中使用php_value auto_prepend_file。
  • 最后,您可以检测您的环境并在顶部写条件以选择两个根目录之间进行选择。
  • 如果您正在使用mod_rewrite,则可以创建一个前端控制器来包含所有其他文件,因此只需要将这些设置放置在一个文件中。

我忘记了auto_prepend_file,这可能是最简单的方法 - 有什么缺点吗? - Haroldo
它只能与Apache和PHP模块一起使用-这是我所知道的唯一限制。我经常使用它。 - Your Common Sense

1
为什么不使用config.php文件呢?
define('SERVER_ROOT',   'C:/wamp/www/site_folder/');
define('SITE_ROOT',     'http://localhost/site_folder/');

而不是将其附加在每个文件的顶部。

require_once ('config.php');

一旦完成 - 未来就没有问题了。如果您要移动您的网站 - 只需编辑或不覆盖配置文件即可。


0
如果您没有使用VirtualHosts,那么$_SERVER['DOCUMENT_ROOT']可能无法返回正确的值。对于您的网站,它看起来将返回"C:/wamp/www"。
您可以使用这个简单的定义将SERVER_ROOT设置为当前目录后跟一个斜杠(目录分隔符):
define('SERVER_ROOT', dirname(__FILE__) . DIRECTORY_SEPARATOR);

这将会把SERVER_ROOT定义为"C:/wamp/www/site_folder/",适用于你的服务器。

然而,除非所有的.php文件都包含在"C:/wamp/www/site_folder/"中,否则这可能不起作用。对于那些位于该文件夹子目录中的.php文件,该定义将返回不同的值。


它被称为相对路径,不能与复杂的目录结构一起使用。 - Your Common Sense
他确实说他在使用mod_rewrite。如果是这种情况,他的重写可能只指向C:/wamp/www/site_folder中的文件,而不指向任何子目录。 - user353297
很有可能这个网站需要部署到不同的文件夹中,比如mydomain.com/test,如果这样可行,那么就是mydomain.com。 - Haroldo
是的,我在这里发布的代码意味着价值会自动更改,无论您的文件在哪个文件夹中。 - user353297
FILE 提供的是文件名的路径,而不是根目录?在非基于控制器的设置中,这有什么用处呢? - Haroldo
你的文件/目录结构是什么样子的?(以及你的mod_rewrites设置如何?) - user353297

0

我使用php_uname('n')来获取当前php运行的计算机名称。借助此功能,您可以创建针对每台计算机的配置文件:

$configFile = 'config/' . php_uname('n') . '.config.php';

if (file_exists($configFile)) {
    include($configFile);
}

然后您将配置指令放置在config/your_computer_name.config.php和config/live_servers_name.config.php中。


这看起来很聪明,有人对这种方法有什么想法吗? - Haroldo
@Haroldo,这个方法在我的答案中的第4项中列出。虽然不如将这些定义放在单个配置文件中好,但实现方式与其他相对路径解决方案一样糟糕。 - Your Common Sense

0
在您的docroot中创建一个文件。将其命名为settings.inc。
//settings.inc:

define('SITE_ROOT',     'site_folder');
require_once (dirname(__FILE__)) . '/st_wd_assets/inc/func_st_wd.php';

然后在每个文件中,

require_once (dirname(__FILE__)) . "/settings.inc";

不用担心CSS或超链接的根路径等问题,只需在前面加上“/”即可。

dirname(__FILE__) 是无意义的结构。如果所有文件都在同一个目录中,它是无用的,你可以只写 require_once "settings.inc"; 至于其他目录,这样做就行不通了。 - Your Common Sense
他的网站根目录不仅仅是 / 而是 /test/。这很愚蠢但却是事实。 - Your Common Sense
我的根目录是 /,但我需要在某处测试并获取反馈,因此可以使用 /test/、beta.mydomain 或类似的路径。 - Haroldo
@Haroldo,你的根目录不是 /,而是 /site_folder/,这就是你提出问题的唯一原因。 - Your Common Sense
我之所以问这些问题,是因为我的根目录会根据以下情况而改变:a)本地机器;b)测试服务器;c)生产站点。 - Haroldo

0
通过相对目录的引用和类自动加载,您可以避免使用SERVER_ROOT.像SITE_ROOT这样的内容应该存储在一个配置文件中,并且在需要时被引入。

相对路径加上mod_rewrite会出现问题。 - Haroldo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接