在HTML中,我可以通过以“/”开头的文件路径,从 Web服务器的根文件夹开始找到一个文件。像:
/images/some_image.jpg
我可以将该路径放在任何子目录中的任何文件中,它将指向正确的图像。
使用PHP,我尝试了类似的东西:
include("/includes/header.php");
......但这不起作用。
我认为this page表示我可以设置include_path
一次,之后会假设。但我不太懂语法。这两个例子都以句号开头,并说:
使用。在include路径中允许相对包含,因为它表示当前目录。
相对包含正是我不想要的。
如何确保我的所有包含都指向root/includes
文件夹?(奖励:如果我想将该文件夹放在公共目录之外该怎么办?)
我的开发文件目前由XAMPP / Apache提供。这会影响绝对路径吗? (我不确定生产服务器是什么。)
我不知道我的问题在这里。我上面引用的include_path
内容正是我所寻找的,而且语法并不是真的令人困惑。我只是尝试了它,效果很好。
我发生的一件事是,有些人可能认为“/ some / path”是“绝对路径”,因为他们认为操作系统是Linux。此服务器是Windows,因此绝对路径必须以驱动器名称开头。
无论如何,问题解决了! :)
答案 0 :(得分:45)
我所做的是将config.php文件放在我的根目录中。我的项目中的所有PHP文件都包含此文件。在那个config.php文件中,我然后执行以下操作;
define( 'ROOT_DIR', dirname(__FILE__) );
然后在所有文件中,我知道我的项目的根源是什么,可以做这样的事情
require_once( ROOT_DIR.'/include/functions.php' );
对不起,没有获得公共目录以外的奖励积分;)这也有一个不幸的副作用,你仍然需要一个相对路径来查找config.php,但它使你的其他包括更容易。
答案 1 :(得分:24)
我不知道这是不是最好的方式,但它对我有用。
$root = $_SERVER['DOCUMENT_ROOT'];
include($root."/path/to/file.php");
答案 2 :(得分:8)
include_path设置与unix中的$ PATH类似(Windows中也有类似的设置)。它包含多个目录名,由冒号(:)分隔。当您包含或要求文件时,将按顺序搜索这些目录,直到找到匹配项或搜索所有目录。
因此,要确保您的应用程序始终包含您的路径(如果该文件存在),只需将include目录放在目录列表中。
ini_set("include_path", "/your_include_path:".ini_get("include_path"));
这样,首先搜索include目录,然后搜索原始搜索路径(默认为当前目录,然后是PEAR)。如果您在修改include_path时没有问题,那么这就是您的解决方案。
答案 3 :(得分:3)
include / require中没有任何内容禁止您使用绝对路径。 所以你的例子
include('/includes/header.php');
应该工作得很好。假设路径和文件是corect并且设置了正确的权限 (从而允许您在文档根目录内外包含您喜欢的任何文件)
然而,这种行为被认为是一种可能的安全风险。因此,系统管理员可以设置open_basedir指令。
此指令配置您可以包含/要求文件的位置,这可能只是您的问题 某些控制面板(例如plesk)默认情况下将此指令设置为与文档根相同。
至于'.'
语法:
/home/username/public_html <- absolute path public_html <- relative path ./public_html <- same as the path above ../username/public_html <- another relative path
但是,我通常使用稍微不同的选项:
require_once(__DIR__ . '/Factories/ViewFactory.php');
在此版本中,您指定相对于包含require_once()
语句的文件的绝对路径。
答案 4 :(得分:2)
另一种选择是使用绝对路径的定义在$_SERVER['DOCUMENT_ROOT']
目录中创建一个文件。
例如,如果您的$_SERVER['DOCUMENT_ROOT']
目录是
C:\wamp\www\
创建一个包含此
的文件(即my_paths.php
)
<?php if(!defined('MY_ABS_PATH')) define('MY_ABS_PATH',$_SERVER['DOCUMENT_ROOT'].'MyProyect/')
现在您只需要在MyProyect文件夹中的每个文件中包含此文件(my_paths.php
),这样您就可以将MY_ABS_PATH
用作MyProject的绝对路径。
答案 5 :(得分:0)
不是直接回答你的问题,而是要记住的事情:
在你的ini中使用include with allow_url_include时要注意,当从包含的文件访问会话时,如果从脚本中使用绝对文件引用包含一个文件,然后使用url文件在本地服务器上包含第二个文件引用它们具有不同的变量范围,并且不会从两个包含的文件中看到相同的会话。原始会话将不会从包含URL的文件中看到。
答案 6 :(得分:0)
<?php
$path = getcwd();
$myfile = "/test.inc.php";
/*
getcwd()指向: / usr / srv / apache / htdocs / myworkingdir(例如)
echo ($path.$myfile);
would return...
/usr/srv/apache/htdocs/myworkingdir/test.inc.php
access outside your working directory is not allowed.
*/
includ_once ($path.$myfile);
//some code
?>
好日子
strtok的
答案 7 :(得分:0)
我在这个上遵循Wordpress的例子。我去定义一个根路径,通常是文档根目录,然后定义一堆其他路径(每个我的类目录一个.IE:数据库,用户,HTML等)。通常我会手动定义根路径,而不是依赖服务器变量。
示例强>
if($_SERVER['SERVERNAME'] == "localhost") { define("ABS_PATH", "/path/to/upper/most/directory"); // Manual } else { define("ABS_PATH, dirname(__FILE__)); // This defines the path as the directory of the containing file, normally a config.php } // define other paths... include(ABS_PATH."/mystuff.php");
答案 8 :(得分:0)
谢谢 - 如果您使用google for php apache windows绝对路径,这是2个链接中的一个。
作为中间PHP开发人员的新手我不明白为什么apache windopws系统上的绝对路径将是c:\ xampp \ htdocs(apache document root - XAMPP default)而不是/
因此,如果在http // localhost / myapp / subfolder1 / subfolder2 / myfile.php中,我想要包含来自http // localhost / myapp
的文件我需要将其指定为: 包括( “C:\ XAMPP \ htdocs中\ MYAPP \ includeme.php”) 要么 包括( “../../ includeme.php”)
而不是 包括( “/ MyApp的/ includeme.php”)
答案 9 :(得分:0)
我想出了一行代码来设置我的每个PHP脚本的顶部以补偿:
<?php if(!$root) for($i=count(explode("/",$_SERVER["PHP_SELF"]));$i>2;$i--) $root .= "../"; ?>
通过这个建筑物$ root to bee“../”从文件所在的任何位置升级到层次结构。 每当我想要包含absolut路径时,该行将是:
<?php include($root."some/include/directory/file.php"); ?>
我真的不喜欢它,似乎是一种解决它的尴尬方式,但它似乎可以运行任何系统php运行和文件放置的位置,使其独立于系统。
要访问网络目录之外的文件,请在../
之后再添加一些$root
,例如$root."../external/file.txt"
。