Реализация 100% переносимого php-приложения - PullRequest
0 голосов
/ 13 февраля 2012

Я ищу способ, позволяющий моим приложениям PHP быть полностью переносимым.Моя проблема в том, что, хотя я использую относительный путь для включения классов PHP, я всегда сталкиваюсь с проблемами, когда пытаюсь развернуть свое приложение в новой среде.

Например, я реализовал приложение под Ubuntu, и оно простобеги отлично.Однако, когда я переместил его на общий хостинг под управлением Centos, мне пришлось изменить все операторы include.

Итак, я спрашиваю о наилучшем способе включения классов, учитывая наличие нескольких папок, содержащих различные классы, которыезависят от нескольких других классов на разных уровнях иерархии папок.

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

просто сохраните одну «основную» папку.

В вашем index.php (например) настройте расположение «основной» папки и используйте ее в качестве «базы» для включений (я полагаю, вам сложно-кодировать путь 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.......
0 голосов
/ 14 февраля 2012

Вам вообще не нужно ссылаться на жесткую папку.В моем текущем проекте я делаю это:

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

Класс, в котором эта функция - два уровня папок внутри проекта - следовательно, два оператора .. для обхода структуры каталогов.Так как это местоположение никогда не изменится относительно корня проекта, его не нужно менять, и мне никогда не нужно фиксировать какие-либо пути.

Редактировать: в отношении операторов include / require используйтеавтозагрузчик, и (кроме пары файлов начальной загрузки), которые вам вообще не нужно использовать, вообще включает / требует.

...