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

时间:2012-02-13 18:13:24

标签: php deployment include hierarchy

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

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

所以,我想问一下包含类的最佳方法,考虑让多个文件夹包含各种类,这些类依赖于文件夹层次结构的不同级别中的另一个多个类。

2 个答案:

答案 0 :(得分:1)

只保留一个“主”文件夹。

在你的index.php(例如)中配置“main”文件夹位置,并将其用作包含的“基础”(我想你是硬编码include / require路径?)

否则在自动加载功能中使用“base”。

现在你可以移动'main'文件夹了,你需要做的就是只更新index.php中的一行代码

它仍然是手动更新。诚然。你也可以。使用类似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);

的index.php / utest.php:

<?php
include("cfg.php");

// Start library
require_once LIB.'Library.php';
$library = new Library();
//etc.......

答案 1 :(得分:0)

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

public static function getProjectRoot()
{
    return realpath(
        dirname( __FILE__ ) . DIRECTORY_SEPARATOR . '..' .
            DIRECTORY_SEPARATOR . '..'
    );
}

此功能的类是项目中的两个文件夹级别 - 因此两个..运算符遍历目录结构。由于该位置永远不会相对于项目根目录发生变化,因此不需要更改,我也不需要硬连线任何路径。

编辑:关于include / require语句,使用自动加载器,(除了几个引导程序文件),通常不需要使用includes / requires。