实现一个100%可移植的php应用程序

实现一个100%可移植的php应用程序,php,deployment,include,hierarchy,Php,Deployment,Include,Hierarchy,我正在寻找一种方法,使我的PHP应用程序能够完全可移植。我的问题是,尽管我使用相对路径来包含PHP类,但当我尝试在新环境中部署我的应用程序时,我总是会遇到问题 例如,我在Ubuntu下实现了一个应用程序,它运行得非常好。然而,当我将它移动到运行Centos的共享主机时,我不得不修改所有的include语句 因此,我想知道包含类的最佳方式,考虑到有多个文件夹,其中包含不同的类,这些类依赖于文件夹层次结构中不同级别的其他多个类。只需保留一个“主”文件夹即可 在index.php(例如)中,配置“ma

我正在寻找一种方法,使我的PHP应用程序能够完全可移植。我的问题是,尽管我使用相对路径来包含PHP类,但当我尝试在新环境中部署我的应用程序时,我总是会遇到问题

例如,我在Ubuntu下实现了一个应用程序,它运行得非常好。然而,当我将它移动到运行Centos的共享主机时,我不得不修改所有的include语句

因此,我想知道包含类的最佳方式,考虑到有多个文件夹,其中包含不同的类,这些类依赖于文件夹层次结构中不同级别的其他多个类。

只需保留一个“主”文件夹即可

在index.php(例如)中,配置“main”文件夹位置,并将其用作include的“base”(我想您需要硬编码include/require路径?)

否则在自动加载功能中使用“基本”

现在您可以移动“main”文件夹,只需更新index.php中的一行代码即可

它仍然是一个手动更新。没错。你也可以选择ofc。使用glob()之类的工具搜索“mainlib.php”文件(例如)并“缓存”文件夹位置,以便在下次调用中使用它?
例如,我就是这样做的:

<?php
/**
 * cfg.php
 *
 * Main config file
 *
 * @package Public
 */

// Compatibility
$version = '5.2.3';//restricted by htmlentities()' 4th parameter
if(version_compare(PHP_VERSION, $version, '<')) {
    die('Required PHP version is ' . $version . ', current is ' . PHP_VERSION);
}

// Environment
define('DEVELOPMENT', in_array($_SERVER['REMOTE_ADDR'], array('127.0.0.1', '::1')));
define('PRIVATE_DIR', DEVELOPMENT ? 'private' . DIRECTORY_SEPARATOR : '..'.DIRECTORY_SEPARATOR.'private_html'.DIRECTORY_SEPARATOR.'tickets');
define('APPLICATION_LINK','application_red'.DIRECTORY_SEPARATOR);
define('LIBRARY_LINK','library'.DIRECTORY_SEPARATOR);
define("MEM_START",memory_get_usage(true));

// Behavior
if(DEVELOPMENT) {
    ini_set('display_errors', 'On');
    error_reporting(E_ALL | E_STRICT);//report all errors
}
else {
    ini_set('display_errors', 'Off');
    error_reporting(0);
}

// Timezone
date_default_timezone_set('Europe/Amsterdam');

// Constants
define('ROOT',  dirname(__FILE__) . DIRECTORY_SEPARATOR);
define('APP',   ROOT . '..'.DIRECTORY_SEPARATOR.PRIVATE_DIR.''.APPLICATION_LINK);
define('LIB',   ROOT . '..'.DIRECTORY_SEPARATOR.PRIVATE_DIR.''.LIBRARY_LINK);
define('CACHE', APP.'cache'.DIRECTORY_SEPARATOR);

您根本不需要引用硬连线文件夹。在我当前的项目中,我会这样做:

public static function getProjectRoot()
{
    return realpath(
        dirname( __FILE__ ) . DIRECTORY_SEPARATOR . '..' .
            DIRECTORY_SEPARATOR . '..'
    );
}
此功能所在的类是项目中的两个文件夹级别-因此是两个。。运算符向上遍历目录结构。因为该位置相对于项目根永远不会改变,所以不需要改变,我也不需要硬连线任何路径


编辑:对于include/require语句,使用自动加载器,并且(除了两个引导文件外)您通常根本不需要使用include/requires。

@DamienPirsy:是的,因为例如,在一台机器中它将是“/var/www/myapp”,而在另一台机器中则是“/var/username/www/myapp”。在某些情况下,也许“/var/username/www/myapp”,但index.php并不是我所有文件的起点。我将有这样的文件:index.php add.php download.php control.php等等。我不想将主文件夹位置放在所有文件夹中。在同一根文件夹中使用类似config.php的内容吗?在你的其他文件中包含那个文件?我在寻找更好的解决方案。无论如何,谢谢你的回答。因为这是这里唯一合理的答案,我会接受它。我已经用我的真实生活例子更新了我的答案,说明我是如何用我的框架来做的。它在我运行的任何服务器上运行。在windows和linux上都是如此。而且,我总是至少等一天才接受答案。但是还是要感谢:-)顺便说一句,您也可以使用
\uuuu DIR\uuuu
,但只能从PHP5.3开始使用。在Apache中进行重写时,我在使用DIR时遇到了一些问题。特别是使用
/project/path/index.php
通过URI使用
/project/path/api/index.php
,例如
localhost:5000/api/v1/something
,它使用
中的include。我认为最好的解决方案确实是使用硬编码的rootpath变量,您只需在不同的环境/服务器中更改它,然后将其用作所有包含的根。@juhaftinen:这很奇怪,
\uuuu DIR\uuu
不应该受到
mod\u rewrite
的影响。它用于遍历目录结构,而不是URL结构。
public static function getProjectRoot()
{
    return realpath(
        dirname( __FILE__ ) . DIRECTORY_SEPARATOR . '..' .
            DIRECTORY_SEPARATOR . '..'
    );
}