因此,我的代码使用了相对路径,但遇到了一些常见文件的问题,这些文件可能包含/要求来自不同的目录级别。
无论如何绝对路径更有效率,对吧?因此,我使用require_once('http://' . $_SERVER['HTTP_HOST'] . 'file_name.php');
$_SERVER['HTTP_HOST']
是正确的,不是吗?当我用Google搜索时似乎如此。
这要求我在php.ini中设置'allow_url_include = on`并重启Apache。
所以,现在我的情况看起来像这样(简化示例):
File2.php包含
<?php
function hello()
{
echo 'hello<br>';
}
?>
如果file1.php包含
<?php
require_once('file2.php');
hello();
?>
然后我看到预期的输出“hello”,但如果我将该行更改为
require_once('http://' . $_SERVER['HTTP_HOST'] . '/file2.php');
然后我得到“致命错误:在C:\ xampp \ htdocs \ file1.php中调用未定义的函数hello()”
(我想对c:\ xammp \ httdos的引用来自Xdebug,因为PhpInfo显示了HTTP_HOST localhost)
无论如何,这是一篇很长的帖子,说我错过了一些简单的观点并询问它是什么。
答案 0 :(得分:7)
当你require
一个完整的URL时,PHP向服务器发出请求并返回PHP脚本的输出 - 这将不包含任何实际的PHP代码(除非脚本本身输出PHP代码。)
此外,您不会在使用相对路径和绝对路径之间看到任何明显的性能差异,因此不要过于担心它。实际上,您的路径不是绝对路径,而是绝对URI,并且获取URI实际上将比使用本地路径慢方式。
答案 1 :(得分:4)
require_once需要服务器上的路径而不是URL。例如,您无法传递http://www.foo.com/test.php,但您可以执行/var/www/foo/test.php。如果你把http://路径放在那么它只包含输出而不包括php函数。
答案 2 :(得分:2)
绝对意味着相对于文件系统。您在使用http://...
时使用了网址,但在使用file2.php
时使用了普通包含。要使用实际绝对路径,请使用require_once('/xampp/htdocs/file2.php');
。
答案 3 :(得分:1)
当您在PHP中require
或include
文件时,该文件将从本地文件系统合并到当前脚本中,除非文件路径包含HTTP等架构,然后它将包含在其中一个fopen包装。见http://www.php.net/manual/en/function.include.php
PHP根据某些因素确定文件的完整路径。
绝对路径(一个以DIRECTORY_SEPARATOR
开头(例如/
)或已识别的驱动器号(例如C:\
)用于Windows服务器)是最快的,因为没有转换要做。该文件只是从给定位置合并而来。
PHP将搜索include_path
堆栈(FIFO)中的相对路径。这是一个包含一个或多个“基本”路径的PATH_SEPARATOR
(;
)分隔字符串。
示例包括路径
/usr/share/pear;.
这包含两个路径/usr/share/pear
和.
,即当前工作目录(CWD)。
如果您专门设置包含路径并删除任何不相关的内容,您将在应用程序中获得最佳性能。例如,假设所有“可包含”文件都位于/home/me/www/appname/includes
中,最好的办法是在引导程序/公共脚本中设置它,例如
set_include_path('/home/me/www/appname/includes');
现在任何相对包含调用都只会从此位置获取。
如果你需要设置多个路径,我发现这样的东西效果很好
set_include_path(implode(PATH_SEPARATOR, array(
'/include/path/one',
'/include/path/two'
)));
如果你想修改服务器包含路径,我建议以相同的方式添加它,但将它放在堆栈的底部,例如
set_include_path(implode(PATH_SEPARATOR, array(
'/include/path/one',
'/include/path/two',
get_include_path()
)));
恕我直言,你可以做的最好的事情之一是从包含路径中删除CWD,因为它往往是“包含路径地狱”的最大来源之一。如果确实需要包含相对于当前文件的文件,请使用
require_once realpath(dirname(__FILE__)) . '/relative/path/to/file.php';