Перейти к содержанию
aVadim

Разработчикам на заметку: универсальная конфигурация движка

Рекомендуемые сообщения

Если вы серьезно занимаетесь разработкой, а не просто "погулять вышли", то один и тот же проект у вас крутится, как минимум, на двух серверах - на девелопер-сервере (где, собственно, вы и занимаетесь кодингом), и на продакшн-сервере - это уже рабочий сервер у хостера, доступный публике, куда вы заливаете результаты своего труда.

Понятно, что самый простой способ залить изменения - это сделать сравнение папок (локальных и удаленных) и залить измененные файлы. Но тут часто разработчики наступают на одни и те же грабли с завидной регулярностью: файла конфигурации. Ведь они отличаются на локальном и удаленном серверах - везде прописаны свои папки, свои пути, свои базы и т.д., которые не совпадают на сервере локальном и на удаленном. Поэтому надо следить, чтобы при заливке файлов измененных файлов не трогались файлы конфигурации. Проблема мелкая, но я сам раньше постоянно на это натыкался - сначала зальешь, потом спохватишься, что сайт перестал работать, и давай быстро конфиги в порядок приводить. В общем, я как-то для себя нашел решение, которое использую сейчас и в ocStore.

Для начала я создал в корне проекта файл defines.php, где определяю константу LOCALHOST и общие константы, которые используются и в админке, и в клиентской части:

<?php

// Определение локального сервера
if (($_SERVER['SERVER_ADDR'] == '127.0.0.1' AND $_SERVER['REMOTE_ADDR'] == '127.0.0.1')
        OR (strpos($_SERVER['SERVER_NAME'], 'localhost') !== false)
        OR (substr($_SERVER['SERVER_NAME'], -6) == '.local')
        OR (substr($_SERVER['SERVER_NAME'], -4) == '.loc')
) {
    define('LOCALHOST', 1);
} else {
    define('LOCALHOST', 0);
}

define('DOCROOT', dirname(__FILE__));

if (LOCALHOST) {

// DB
    define('DB_DRIVER', 'mysql');
    define('DB_HOSTNAME', 'localhost');
    define('DB_USERNAME', 'user');
    define('DB_PASSWORD', 'psw');
    define('DB_DATABASE', 'db_name_local');
    define('DB_PREFIX', 'oc_');
} else {
    define('DB_DRIVER', 'mysql');
    define('DB_HOSTNAME', 'localhost');
    define('DB_USERNAME', 'user');
    define('DB_PASSWORD', 'psw');
    define('DB_DATABASE', 'db_name_remote');
    define('DB_PREFIX', 'oc_');
}

// DIRs
define('DIR_SYSTEM', DOCROOT . '/system/');
define('DIR_DATABASE', DOCROOT . '/system/database/');

define('DIR_CONFIG', DOCROOT . '/system/config/');
define('DIR_IMAGE', DOCROOT . '/image/');
define('DIR_DOWNLOAD', DOCROOT . '/download/');
define('DIR_CACHE', DOCROOT . '/_cache/_sys/');
define('DIR_TMP', DOCROOT . '/_cache/_tmp/');
define('DIR_DATA', DOCROOT . '/_data/');

// EOF

Затем переписал файлы config.php для клиентской части:

<?php
require_once 'defines.php';

// DIR
define('DIR_APPLICATION', DOCROOT . '/catalog/');
define('DIR_LANGUAGE', DOCROOT . '/catalog/language/');
define('DIR_THEME', DOCROOT . '/catalog/view/theme/');
define('DIR_LOGS', DOCROOT . '/system/logs/');

// EOF

и то же самое для админки:

<?php

require_once '../defines.php';

if (LOCALHOST) {
    define('SITE_NAME', 'my-site.local');
} else {
    define('SITE_NAME', 'my-site.ru');
}

// HTTP
define('HTTP_SERVER', 'http://' . SITE_NAME . '/admin/');
define('HTTP_CATALOG', 'http://' . SITE_NAME . '/');
define('HTTP_IMAGE', 'http://' . SITE_NAME . '/image/');

// HTTPS
define('HTTPS_SERVER', 'http://' . SITE_NAME . '/admin/');
define('HTTPS_IMAGE', 'http://' . SITE_NAME . '/image/');

// DIR
define('DIR_APPLICATION', DOCROOT . '/admin/');
define('DIR_LANGUAGE', DOCROOT . '/admin/language/');
define('DIR_THEME', DOCROOT . '/admin/view/');
define('DIR_TEMPLATE', DOCROOT . '/admin/view/template/');
define('DIR_LOGS', DOCROOT . '/system/logs/');
define('DIR_CATALOG', DOCROOT . '/catalog/');

// EOF

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

  • +1 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пользуюсь diff вместе с patch - никогда такой проблемы небыло. Перед применением изменений всегда просматриваю файл патча и если что-то не так, я это сразу же вижу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пользуюсь diff вместе с patch - никогда такой проблемы небыло.

Ну ведь не с самого рождения ты их используешь, верно? ;) Когда-то ты и слов таких не знал.

Перед применением изменений всегда просматриваю файл патча и если что-то не так, я это сразу же вижу.

А зачем сложно, когда можно просто? В сравнительно небольших проектах, типа такого, что на ocStore сейчас делается, не вижу необходимости тратить время на это. Внес нужные изменения, проверил работоспособность - и льешь себе на продакшн измененные файлы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну ведь не с самого рождения ты их используешь, верно? ;) Когда-то ты и слов таких не знал.

Так ведь и разработчиком я не родился :)

А зачем сложно, когда можно просто? В сравнительно небольших проектах, типа такого, что на ocStore сейчас делается, не вижу необходимости тратить время на это. Внес нужные изменения, проверил работоспособность - и льешь себе на продакшн измененные файлы.

Возможностей напортачить есть много. Где-то лишнее что-то удалил, или что-то лишнее оставил, да и просто вспомнить где что поменял бывает полезно.

Так что считаю использование этих утилит просто необходимым если:

Если вы серьезно занимаетесь разработкой, а не просто "погулять вышли"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Идея разумная. Нечто подобное я использовал в одном из своих проектов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за идею. Понравилось само решение. Респект "гуляющим" Разработчикам! :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А не проще ли использовать FTP Sync?

http://www.decodephp.com/2007/12/04/web-based-ftp-sync-tool-written-in-php/

Есть возможность запрещать синхронизацию для отдельных файлов/папок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.