在尝试包含在本地环境与生产中具有不同路径的文件时,我一直感到困惑。
例如,我在我的usercontroller.php
文件中有这个:
require_once(__DIR__ . '/config.php');
在我的本地主机上,usercontroller.php
位于www/myproject/inc/
,config.php
位于www/myproject/
(项目根目录)
这失败了。
我想要的是一种定义项目根目录的方法。即在本地主机上它是www/projectname
而在制作中它是/
因为文件位于我的本地主机上的projectname
目录内,所以它在我的生产服务器上引起了问题。
简单地定义基本路径并从中构建我的require_once
的最佳方法是什么?
即。 require_once($basePath . 'inc/filename.php'
答案 0 :(得分:1)
大多数项目使用config.inc.php
文件位于可以定义这些内容的公共位置。
<强>的config.inc.php 强>
define('ROOT_FOLDER', '/');
define('APPLICATION_LINK', 'http://www.example.com/mysite');
<强>的script.php 强>
require ('../config.inc.php');
echo '<a href="' . APPLICATION_LINK . '">Go home</a>';
答案 1 :(得分:0)
每个项目都应包含一个包含此信息的config.php文件。
的config.php
define('ENVIRONMENT', 'PRODUCTION');
// define('ENVIRONMENT', 'TESTING');
// define('ENVIRONMENT', 'DEVELOPMENT');
switch (ENVIRONMENT) {
case 'PRODUCTION':
define('BASE_URL', 'http://www.mysite.com');
define('BASE_PATH', '/');
break;
case 'TESTING':
define('BASE_URL', 'http://test.mysite.com');
define('BASE_PATH', '/test/');
break;
case 'DEVELOPMENT':
define('BASE_URL', 'http://localhost/');
define('BASE_PATH', '/www/myproject/');
break;
}
然后可能有一个URL帮助文件。
url_helper.php
function site_url($relative) {
return BASE_URL . $relative;
}
function redirect($uri = '', $method = 'location', $http_response_code = 302) {
if ( ! preg_match('#^https?://#i', $uri)) {
$uri = site_url($uri);
}
switch($method) {
case 'refresh' : header("Refresh:0;url=".$uri);
break;
default : header("Location: ".$uri, TRUE, $http_response_code);
break;
}
exit;
}
负载助手。
load_helper.php
function load_file($uri) {
require BASE_PATH . $uri;
}
function load_class($class) {
if ( ! class_exists($class))
load_file('class/' . $class);
}
这些功能可以更加强大,以满足您的需求。优点是您可以为生产/开发,各种服务器或仅针对特定环境配置不同的配置。如果您始终使用site_url函数生成网站周围的网址,则可以通过在单个文件中进行一次更改来轻松更改网址的解释方式。
答案 2 :(得分:0)
也许这样的事情可以解决问题!
switch(dirname(__FILE__)) {
case '/www/myproject/inc/':
//DEFINE SOMETHING
break;
case '/www/myproject/':
//DEFINE SOMETHING
break;
}
答案 3 :(得分:0)
如docs __DIR__
中所述,返回使用它的文件的目录。
DIR - 文件的目录。如果在include中使用,则返回包含文件的目录。这相当于dirname( FILE )。除非它是根目录,否则此目录名称没有尾部斜杠。 (在PHP 5.3.0中添加。)
要在外部目录中包含文件,您必须使用..
来“离开”内部目录。
require_once(__DIR__ . '../config.php');
另外,如果您使用PHP的命名空间,我建议您查看FIG's autoloading standards。
答案 4 :(得分:0)
我知道这个答案已经很晚了,但你还没有接受任何答案,所以我想我会在大多数应用程序中使用它。
首先,首先,从您调用config.php
的文件中,您将始终需要使用相对参考,即您的示例中的require_once '../config.php';
。当然,你可以收集&#39;从PHP命令获取配置文件的完整路径,但为什么当你知道它的一个目录时,你会这样做,然后在其中,你可以define
整个基本路径项目。例如,在您的www/myproject/inc/usercontroller.php
文件中,顶部看起来像:
<?php
require_once '../config.php';
然后,要在配置中自动获取项目的完整基本路径以用于其他包含等,您可以使用以下内容:
<?php
$basepath = dirname(__FILE__);
define('BASEPATH', $basepath);
//Or all in one line:
define('BASEPATH', dirname(__FILE__));
从那里,只需在需要项目根目录的完整路径时使用BASEPATH
。 ^^