PHP:包含适用于Dev和Live的路径

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP:包含适用于Dev和Live的路径相关的知识,希望对你有一定的参考价值。

我最近一直试图改进我的开发/实时工作流程以获得1:1的平价。我希望Dev(我的本地机器)上的所有内容都与现场(Web)上的内容相同。除了拥有不同的配置文件(包含不同的mysql凭据)和不同的.htaccess文件之外,我希望网站的其余部分在我的实时环境中与在我的开发环境中完全相同。问题是我不能让我的包含路径在两个environemnts上以相同的方式解决。

我已按以下格式配置了所有包含:

包括路径

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

问题是在我的LIVE服务器上,$_SERVER["DOCUMENT_ROOT"]不包含/ website1 / part,但在我的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更改包含路径,但似乎没有任何工作。我知道必须有一个简单的解决方案,但我迷路了。理想情况下,我希望将任何配置更改为本地环境,以避免篡改实时环境。

非常感激!

答案

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

*选项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.

另一答案

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

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

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

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

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

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

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

能够在include路径中指定公共目录的父目录会很好,因此include语句可以引用“common / standard.php”以确保没有名称冲突,但这会产生所有文件和目录在父服务器上的每个网站都可以通过名称访问!

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

以上是关于PHP:包含适用于Dev和Live的路径的主要内容,如果未能解决你的问题,请参考以下文章

PHP获取当前URL路径的处理(适用于多条件筛选列表)

PHP 是不是包含相对于文件或调用代码的路径?

PHP Drupal - 适应live&dev服务器的Settings.php

代码适用于与单个 html 文件不同的堆栈片段

VSCODE 片段 PHP 自动填充命名空间

webpack-dev-server 似乎只适用于静态文件