【问题标题】:Setting PHP Include Path on a per site basis?为每个站点设置 PHP 包含路径?
【发布时间】:2010-09-06 16:19:40
【问题描述】:

我可以在php.ini中设置PHP包含路径:

include_path = /path/to/site/includes/

但随后其他网站受到影响,所以不好。

我可以在每个文件的开头设置 PHP 包含:

$path = '/path/to/site/includes/';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);

但这似乎是一种不好的做法,会使事情变得混乱。

所以我可以包含它,然后将它包含到每个文件中:

include 'includes/config.php';

include '../includes/config.php';

这就是我现在正在做的事情,但是 config.php 的包含路径会根据包含它的内容而改变。

有没有更好的方法?有关系吗?

【问题讨论】:

    标签: php include


    【解决方案1】:

    如果您使用 apache 作为网络服务器,您可以使用 .htaccess 文件覆盖(如果您允许)设置。详情请见the PHP manual

    基本上,您将一个名为 .htaccess 的文件放在您的网站根目录中,其中包含一些 PHP ini 值。如果您将 Apache 配置为允许覆盖,则此站点将使用您的 PHP 配置中的所有值,以及您在 .htaccess 文件中指定的值。

    只能与PHP_INI_ALLPHP_INI_PERDIR 类型指令一起使用

    如我链接的页面中所述。如果您点击查看完整列表,您会看到包含路径是 PHP_INI_ALL 指令。

    【讨论】:

      【解决方案2】:

      Erik Van Brakel 给出了最好的答案之一,恕我直言。

      此外,如果您使用的是 Apache 和虚拟主机,您可以直接在其中设置包含。使用这种方法,您不必记住将 php_admin 命令留在您的 .htaccess 中。

      【讨论】:

        【解决方案3】:

        使用网站 root 中的 php.ini 文件,如果您的设置使用 PHP 作为 CGI(共享主机上最常见的情况)与服务器范围的 php.ini 语法相同;如果您将 PHP 作为 Apache 模块,请将其放入 .htaccess(如果不确定,请执行 phpinfo()):

        php_value include_path "wherever"
        

        请注意,每个文件夹 php.ini does 不会影响子文件夹

        【讨论】:

        • php_value include_path "/var/www/somesite.com/include_path/"
        【解决方案4】:

        为什么你认为追加到包含路径是不好的做法?

        根脚本顶部附近的这段代码应该不会那么糟糕......

        $path = '/path/to/site/includes/';
        set_include_path($path . PATH_SEPARATOR . get_include_path());
        

        恕我直言,主要优点是它不仅可移植且兼容 Apache

        编辑:我看到了这种方法的一个缺点:性能影响小。见http://www.geeksengine.com/article/php-include-path.html

        【讨论】:

        • 除了你提到的性能影响之外,当我问这个问题时,我正在处理一个包含许多单独文件而不是所有请求都指向的单个根脚本的站点。
        【解决方案5】:

        根据您的主机设置方式,您可能被允许使用额外的配置指令将php.ini 文件放在主目录的根目录中。

        【讨论】:

          【解决方案6】:

          您的应用程序应该有一个用 PHP 编写的配置文件。然后将其与相对页面一起包含到程序中的每个页面中。该配置文件将具有包含目录、模板目录、图像目录等路径的变量。

          【讨论】:

            【解决方案7】:

            您也可以在 php.ini 文件中设置include_path。我是一个 perl 人,所以我希望能够加载包含并让 include 做正确的事情。我将所有包含在一个特定目录中,该目录已添加到include_path。我可以做类似的事情

            require_once "ClassName.php";
            

            我不需要担心文件的相对路径或位置。

            我还写了自己的CustomRequire 来做类似的事情

            function CustomRequire ($file) {
                if(defined('MYINCLUDEPATH')) {
                    require_once MYINCLUDEPATH . "/$file";
                } else {
                    require_once $file;
                }
            }
            

            这样我可以在以后更改包含的方式。当然,您仍然需要找到一种方法来包含您的包含代码:)

            【讨论】:

            • 为什么人们不喜欢@Gary 的回答?在我看来,在 SO 的一个不好的做法是 - 从“无限智慧”中对 cme​​ts 投反对票,没有在 cmets 部分进行解释。
            • 嗯。这就是你的 PHP。我仍在使用这个系统,它在 APC 性能方面表现出色。如果可以,请使用自动装载机。自动加载器的问题是,如果你想在文件系统上对你的类布局有任何类型的结构(例如php.net/manual/en/language.oop5.autoload.php#49496),你必须把你的类名混为一谈。我很想听到更好的选择!
            • 加里,我只是指出人们倾向于在不评论的情况下投反对票。就我而言,您的回答是合法的。
            猜你喜欢
            • 2013-10-10
            • 2011-09-24
            • 2014-03-06
            • 2010-12-09
            • 2011-02-15
            • 2013-03-05
            • 2010-09-25
            相关资源
            最近更新 更多