使用完全限定的URL时出现require()问题

时间:2010-11-12 02:32:08

标签: php

因此,我的代码使用了相对路径,但遇到了一些常见文件的问题,这些文件可能包含/要求来自不同的目录级别。

无论如何绝对路径更有效率,对吧?因此,我使用require_once('http://' . $_SERVER['HTTP_HOST'] . 'file_name.php');

将所有include / require更改为绝对路径

$_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)

无论如何,这是一篇很长的帖子,说我错过了一些简单的观点并询问它是什么。

4 个答案:

答案 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中requireinclude文件时,该文件将从本地文件系统合并到当前脚本中,除非文件路径包含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';