【问题标题】:How to include config.php efficiently?如何有效地包含 config.php?
【发布时间】:2009-11-11 04:16:57
【问题描述】:

我总是对更有效的方法和学习新事物感兴趣。现在,我在每个文件中都使用代码<?php include('config.php'); ?>。根据文件在我的文件夹结构中的位置,我将拥有<?php include('../config.php'); ?> 甚至<?php include('../../config.php'); ?>。我怎样才能使它更有效率?有没有办法让我的 config.php 在 root 中,并使 root 中的所有内容都需要 config.php?

【问题讨论】:

标签: php


【解决方案1】:

有一种方法可以自动包含文件(auto_prepend_fileini 设置),但是您可以做的最大改进是放弃使用多个 php 文件并使用 index.php 作为整个网站的单一入口点.

假设您编写了一个 SO 克隆 ;) 包含“问题”、“标签”、“用户”等页面。在每个页面上,您需要一些通用的 php 内容(数据库、会话)+ 常见的 html 元素(页眉、页脚)。一种流行的方法是拥有一堆 php 文件(questions.php、tags.php、users.php),每个文件都包含常见的东西。例如,users.php 将如下所示

include 'db.php';
include 'session.php';
include 'html.header.php';
.....users-specific stuff 
include 'html.footer.php';

这非常乏味(您必须重复大量代码)并且不灵活(考虑为网站上的所有页面添加侧边栏)。我的建议是包含“由内而外”,即有一个包含特定页面代码的“通用内容”文件:

 # index.php
 db functions
 session functions
 html header

 $page = isset($_GET['page']) 
   ? preg_replace("/\W+/", "", $_GET['page'])
   : "home";
 include "$page.php";

 html footer

因此,您将在网站上拥有一个入口点 - 这更灵活,更适合调试。唯一的缺点是 url 不太“好”(user.php vs index.php?page=user),但这可以通过 mod_rewrite 轻松解决

【讨论】:

  • 想详细说明一下?这在什么方面是一种改进?性能、可维护性等?
  • 只要有某种模板正在进行(必须有),我想这可以很好地重新定义问题。
  • 我最喜欢这个答案。有很多方法可以加快这个过程,例如使用框架为您自动化它。如果你喜欢,我可以推荐一些。
  • 你可能会更好地指出一个关于干净启动框架的成熟问题的方向,因为它们会让你更广泛地了解不同的选项以及它们如何相互评价.我要说的一件事是:使用模板,不管你最终如何做,php 逻辑与 html 逻辑的分离将使你的工作简化 20 倍,正如我最终懊恼地学会的那样。
  • stackoverflow.com/search?q=simple+php+frameworks 好了,选择一两个有很多答案的问题,您就会对社区首选框架有一个很好的了解。 微笑
【解决方案2】:

将包含config.php 的路径放入你的php include path 中,然后你就可以这样做了:

include 'config.php';

或者更好:

require_once 'config.php';

requireinclude 更受欢迎,因为当由于某种原因(例如,找不到文件、权限错误等)无法包含文件时,它会触发错误而不是警告。 _once 后缀是一个很好的补充,可以确保不会不必要地多次包含同一个文件。

另外,请注意,在您的include 调用中,您不需要在'config.php' 周围加上括号。 include 不是 php 中的函数。这是一种语言结构。括号只是用作不必要的分组,与此示例不同:$myVar = (2 + 2);

【讨论】:

  • 随着 paas 提供者的日益普及和总体上脱节的开发环境,不建议这样做。假设您正在构建一个 Web 应用程序,并且您想要共享您的代码并转移项目。你真的想要求每个参与项目的开发人员都必须配置他们的内部 php.ini 以使你的应用程序正常工作吗?
【解决方案3】:

您可以将基本目录设为常量

define('BASE_DIR', realpath(__FILE__));

把它放在你的 index.php 中

那你就可以了

include BASE_DIR . 'config.php';

【讨论】:

  • 这对于许多不同的用途也很方便 - 为您的应用程序定义一次路径常量总是好的。
  • 我通常有一个 BASE_DIR 和 DOC_ROOT .. BASE_DIR 用于 PHP 使用的目录,DOC_ROOT 作为 HTML 相对路径等的前缀
  • @Alex - 您是否需要在第一页将 BASE_DIR 设置为会话变量才能在更深的页面上使用,还是 PHP 将其保存在内存中?
  • @JM4 您可以在应用程序的 bootstrapping 序列中定义它。用define() 定义的常量是全局的。
  • @alex:除非你害怕符号链接,否则我会使用更高效的dirname 代替 realpath(这很慢)
【解决方案4】:

可以组合的不同选项:

  • 在资源文件中创建不会在源代码管理中跟踪的路径定义。例如定义('LIB_PATH', '/home/tchalvak/project/');

  • 指定一个自动前置文件并在 php.ini 中进行设置。例如包括一个全局的、随处可见的脚本列表,您可以随时添加或从中删除。

  • 最后,我发现或想出了一点路径字符串操作技巧,我忘记了:

    require_once(substr(__FILE__, 0, (strpos(__FILE__, 'lib/')))."resources.php"); // 要求一个文件与另一个已知文件有特定的关系,而不管所涉及的实际路径如何,并且不处理任何定义。

【讨论】:

  • 另外将文件直接放入 php 包含路径中,如 Asaph 上面所说。奇怪的是,我从来没有真正这样做过。我想知道共享项目时是否有缺点?不确定。
【解决方案5】:

以下是我管理所需(包含)文件的方法:

如果可以,我从不在所需文件中使用常量或变量(定义绝对路径)。我发现这有一些优势:

  1. 我不必为我部署的每个版本的网站更改常量。
  2. 像 PHPLint 这样的静态分析工具不适用于这些类型的夹杂物。
  3. 我的编辑器 (Eclipse) 允许我通过控制 + 单击所需文件名导航到所需文件。
  4. 在项目之间共享文件更容易(无需编辑所需路径)

但是……要做到这一点,所有要求和包含都必须是相对的。默认情况下,PHP 使用被调用脚本的当前目录来建立它的包含路径。当调用的脚本不在同一个文件夹中时,这可能会导致问题。因此,让所有请求通过单个脚本的建议会自动消除任何此类问题。

【讨论】:

    猜你喜欢
    • 2013-06-20
    • 2016-06-28
    • 2023-02-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 2014-05-17
    • 2012-09-24
    • 2017-01-23
    相关资源
    最近更新 更多