【问题标题】:PHP: Include path that works both on Dev and LivePHP:包含适用于 Dev 和 Live 的路径
【发布时间】:2014-08-21 12:44:17
【问题描述】:

我最近一直在尝试改进我的开发/实时工作流程,以实现 1:1 对等。我希望一切在 Dev(我的本地机器)上都能像在现场(Web)上一样工作。除了拥有不同的配置文件(包含不同的 mySQL 凭据)和不同的 .htaccess 文件之外,我希望站点的其余部分在我的实时环境中的工作方式与在我的开发环境中的工作方式完全相同。 问题是我无法让我的包含路径在两个环境中以相同的方式解决。

我的所有包含都配置为这种格式:

包含路径

$_SERVER["DOCUMENT_ROOT"] . /website1/includes/file.php 

问题是在我的 LIVE 服务器上,$_SERVER["DOCUMENT_ROOT"] 不包含 /website1/ 部分,但在我的 TEST 服务器上,它包含。这意味着路径在两种环境中的解析方式不同:

直播:

    /some/root/folder/website1/includes/file.php

开发人员:

    /some/root/folder/website1/website1/includes/file.php

我已经通过将包含的文件复制到名为 /website1 的子文件夹中以在 MAMP 开发环境中使用来解决这个问题。但这显然并不理想,因为它增加了不必要的开销。每当我编辑其中一个包含的文件时,我必须确保在两个位置都编辑该文件。

有没有人有任何建议让两个环境中的包含路径相同,没有重复的文件?我曾尝试使用dirname(__FILE__),但这需要进行大量更改才能解析相对路径。我尝试了各种其他解决方案,例如尝试通过 .htaccess、httpd.conf 或 php.ini 更改包含路径,但似乎没有任何效果。我知道必须有一个简单的解决方案,但我迷路了。理想情况下,我希望对本地环境进行任何配置更改,以避免篡改实时环境。

非常感谢!

【问题讨论】:

  • 为什么不在配置文件中设置 $root_path 并在应用程序的任何地方使用它?
  • 配置文件也是通过include拉进来的。
  • $some_root_folder 实际上意味着 $_SERVER["DOCUMENT_ROOT"] 在两个环境中不是同一路径
  • 为清晰起见已更新。谢谢!
  • 您确定要在两个环境中部署具有相同文件夹层次结构的代码吗?

标签: apache include filepath


【解决方案1】:

有多种解决方案,但我在下面提出这 2 个。

* 选项 A *

1 个包含特定环境文件的主配置文件。

<?php
// main config
define('ENV','dev'); // or define('ENV','prod');

require_once __DIR__ . '/config.' . ENV . '.php';

// ...

用于开发的环境特定文件:

<?php
// config.dev.php
$path_to_includes = '/some/root/folder/website1/website1/includes';

// ...

生产环境特定文件:

<?php
// config.prod.php
$path_to_includes = '/some/root/folder/website1/includes';

// ...

在 php 脚本中:

<?php
require_once "$path_to_includes/file.php";

// ...

* 选项 B *

移动您的开发文件夹以匹配生产结构。

$ mv /some/root/folder/website1 /some/root/folder/website.old
$ mv /some/root/folder/website.old/website1 /some/root/folder/website1
$ rm /some/root/folder/website.old

* 选项 C *

将您的 apache2 DocumentRoot 设置为正确的值。开发:

DocumentRoot /some/root/folder/website1

用于生产:

DocumentRoot /some/root/folder

毕竟,我建议您让所有环境完全相同,并在配置文件中使用正确的值对其进行参数化。拥有相同的项目结构有助于简化调试问题,因此我首选的解决方案是选项 B。

【讨论】:

  • 对于选项 B,如果我移动文件,我的 apache 虚拟主机将无法解析。但是如果我更改文档根目录,问题就会再次出现。 ServerName website1.dev ServerAlias www.website1.dev DocumentRoot "/my/path/to/website1"
  • 对于选项 1,看起来每个 php 文件都必须更改。是这样吗?
  • 是的,使用新的 $path_to_includes 变量。
  • 对于选项 b,您的 apache2 虚拟主机应该可以工作。您也可以在更新的评论中尝试选项 C。
  • 我遇到了同样的问题,因为我正在“www.site1.com/subfolder/”(我自己的网站主机上的子文件夹)上开发一个网站并推送到“www.site2.com”(客户网站根目录)。选项 A 似乎是唯一适合我的选项,那么确保我始终链接到正确的配置文件的最佳方法是什么,还是我在部署时必须非常小心?
【解决方案2】:

就我而言,我的开发服务器在 Windows 上,而我的产品服务器在 Linux 上。

几年前,我的第一个解决方案是在文件中添加自定义代码,并根据服务器 IP 地址是否为 127.0.0.1 在每个页面上包含该文件。这很混乱,我从来没有真正满意过。

我的第二个解决方案是在每个页面的目录中放置一个名为 DEVELOP 的文件,而在 prod 系统上没有这样的文件。但这会产生 file_exists() 的开销和激增的 DEVELOP 文件。

我的第三个解决方案是在两台服务器上使用 SetEnv Apache 指令来根据需要自定义环境。但这需要在所有需要自定义的页面中使用 getenv() 或 apache_getenv()。

然后我意识到我真正需要的主要系统范围的定制是使我所有网站中的所有 PHP 程序都能够访问包含常用文件的公共目录。 (在此之前,我将公共目录的副本上传到每个网站的根目录。我必须让它们保持同步。呃。)

提供这种公共访问可以简单地通过在每个服务器的 php.ini 文件中编辑 include_path 指令来获得公共目录的(不同的)绝对路径名(同时我从包含路径,因为这只会产生额外的开销)。

现在我可以从我的许多 php 文件中删除所有笨拙的自定义代码(使用搜索和替换工具并不那么难),并编写对公共文件的引用,就好像它们在当前目录中一样:'require "standard.php “;”。幸运的是,没有一个公共文件或目录的名称与我任何网站中现有文件的名称相同。如果是,则当前目录中的版本将优先于同名的通用文件,并且没有错误消息。

如果能够在包含路径中指定公共目录的父目录,那就太好了,这样包含语句可以引用“common/standard.php”以确保没有名称冲突,但这会使所有在服务器上的每个网站中都可以通过名称访问父目录中的文件和目录!

补充:我想知道我是否可以像这样设置公共目录:/www/commonparent/common?我会在包含路径中添加“/www/commonparent”,并在“common/standard.php”等程序中使用引用。这将是相当安全的,因为消除了名称冲突(commonparent 目录不包含除“common”之外的名称)。我要试试这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-29
    • 2011-02-15
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多