Хостинг. Автоопределение файловых путей

Rock-N-Roll
8 років
0

При написании больших скриптов (состоящих из нескольких можно сказать независимых модулей) у меня часто возникает гимор с файловыми путями. То папку решил переименовать, то вообще изменил структуру каталогов - и начинается выискивание в скриптах мест, где это "вылезает боком" и делаются соответствующие изменения. Когда меня это достало - я придумал код для автоматического определения путей (для php и браузера). Но тут оказалась еще одна лажа - на хостинге работает, а на WAMP'е - нет (для браузерных путей). Дело в том, что в начале пути оказывается лишний слеш (вернее его не хватает :). Пришлось дописать пару "извращенских" строк, т.к. я не уверен, появляется ли этот слеш еще где-то, кроме как у меня :)

Rock-N-Roll
8 років
0

Фрагмент файловой структуры (путь "dir1/dir2/dir3" - величина переменная и непредсказуемая :)

......................................................................
......................................................................
[dir1]..............................................................
...|..................................................................
...|--- [dir2].......................................................
...........|..........................................................
...........|--- [dir3]...............................................
...................|..................................................
...................|--- [tmpl]......................................
...................|.......|...........................................
...................|.......|--- [css]................................
...................|.......|.......|...................................
...................|.......|.......|--- style.css..................
...................|.......|...........................................
...................|.......|--- [img]...............................
...................|.......|.......|...................................
...................|.......|.......|--- icon-16x16.png.........
...................|.......|...........................................
...................|.......|--- index.html........................
...................|...................................................
...................|--- index.php.................................
.......................................................................

Файл index.php - одна из частей большого скрипта, index.html - его шаблон, style.css - стили шаблона, icon-16x16.png - один из рисунков.

Смысл в том, чтобы автоматически определять пути до файла index.php, т.к. структура каталогов в процессе разработки может меняться.

Rock-N-Roll
8 років
0

Собственно код автоматического определения путей (находится в начале файла index.php каждого модуля):

$path['php'] = dirname(__FILE__);

$path['brw'] = str_replace('\\', '/', $path['php']);
$path['brw'] = str_replace($_SERVER['DOCUMENT_ROOT'], '', $path['brw']);
$path['brw'] = '###'.$path['brw'];
$path['brw'] = str_replace('###/', '/', $path['brw']);
$path['brw'] = str_replace('###', '/', $path['brw']);

Rock-N-Roll
8 років
0

Теперь подробнее с описанием:

// Определяем php-путь (для сервера)

// Файловые пути в разных ОС сильно отличаются

// ОС (nix): /home/account/domain.zone/www/dir1/dir2/dir3
// ОС (win): c:\wamp\www\dir1\dir2\dir3

$path['php'] = dirname(__FILE__);

// Определяем brw-путь (для браузера)

// Заменяем символы "\" на "/"

// ОС (nix): /home/account/domain.zone/www/dir1/dir2/dir3
// ОС (win): c:\wamp\www\dir1\dir2\dir3

$path['brw'] = str_replace('\\', '/', $path['php']);

// ОС (nix): /home/account/domain.zone/www/dir1/dir2/dir3
// ОС (win): c:/wamp/www/dir1/dir2/dir3

// Отсекаем серверную часть пути

// ОС (nix): /home/account/domain.zone/www/dir1/dir2/dir3
// ОС (win): c:/wamp/www/dir1/dir2/dir3

$path['brw'] = str_replace($_SERVER['DOCUMENT_ROOT'], '', $path['brw']);

// ОС (nix): /dir1/dir2/dir3
// ОС (win): dir1/dir2/dir3

// Добавляем в начало пути символ "###"

// ОС (nix): /dir1/dir2/dir3
// ОС (win): dir1/dir2/dir3

$path['brw'] = '###'.$path['brw'];

// ОС (nix): ###/dir1/dir2/dir3
// ОС (win): ###dir1/dir2/dir3

// Заменяем символ "###/" символом "/"

// ОС (nix): ###/dir1/dir2/dir3
// ОС (win): ###dir1/dir2/dir3

$path['brw'] = str_replace('###/', '/', $path['brw']);

// ОС (nix): /dir1/dir2/dir3
// ОС (win): ###dir1/dir2/dir3

// Заменяем символ "###" символом "/"

// ОС (nix): /dir1/dir2/dir3
// ОС (win): ###dir1/dir2/dir3

$path['brw'] = str_replace('###', '/', $path['brw']);

// ОС (nix): /dir1/dir2/dir3
// ОС (win): /dir1/dir2/dir3

Получили одинаковые пути для браузера в разных ОС.

Rock-N-Roll
8 років
0

Вот собственно зачем мне это все нужно:

// Выводим стили

echo '<link href="'.$path['brw'].'/tmpl/css/style.css" rel="stylesheet" type="text/css" />';

// Обрабатываем шаблон

$tmpl = file_get_contents($path['php'].'/tmpl/index.html');
$tmpl = str_replace('{path}', $path['brw'], $tmpl);
$tmpl = str_replace('{var1}', $var1, $tmpl);
$tmpl = str_replace('{var2}', $var2, $tmpl);
$tmpl = str_replace('{var3}', $var3, $tmpl);

echo $tmpl;

Rock-N-Roll
8 років
0

Но проще всего это проверить вот так:

echo '<img src="'.$path['brw'].'/tmpl/img/icon-16x16.png">';

Rock-N-Roll
8 років
0

Т.о. скрипт, написанный на локальном сервере (WAMP, Windows) без проблем работает на хостинге и наоборот.

ВОПРОС: будет ли мой код работать на выденном сервере с установленной ОС Windows?

rudenko
8 років
0

Я думаю для скрипта не будет разницы на каком windows ему работать.

rudenko
8 років
0

Обратите внимание:
1. Для того, что б указывать правильные слеши в стиле windows или unix есть константа DIRECTORY_SEPARATOR.
2. Для того, что б убрать начальный и конечный слеш можно использовать trim($path, DIRECTORY_SEPARATOR);

$path['php'] = dirname(__FILE__);
$path['brw'] = str_replace('\\', '/', $path['php']);
$path['brw'] = str_replace($_SERVER['DOCUMENT_ROOT'], '', $path['brw']);
$path['brw'] = '###'.$path['brw'];
$path['brw'] = str_replace('###/', '/', $path['brw']);
$path['brw'] = str_replace('###', '/', $path['brw']);

Rock-N-Roll
8 років
0

Спасибо за "trim" :)

$path['php'] = dirname(__FILE__);

$path['brw'] = str_replace('\\', '/', $path['php']);
$path['brw'] = str_replace($_SERVER['DOCUMENT_ROOT'], '', $path['brw']);
$path['brw'] = '/'.trim($path['brw'], '/');

Кто придумает еще короче вариант?

Тема закрита.