Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с относительными путями в require_once 
:(
    Опции темы
Royan
  Дата 16.12.2007, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Вопрос такой. У меня есть структура файлов и каталогов (см. приаттаченый рисунок)

Ошибка которую я получаю выглядит так

Цитата

Warning: require_once(../../global.inc) [function.require-once]: failed to open stream: No such file or directory in E:\www\root\utils\logs\logger.inc on line 3
Fatal error: require_once() [function.require]: Failed opening required '../../global.inc' (include_path='.;E:\www\root\') in E:\www\root\utils\logs\logger.inc on line 3


Происходит эта ошибка оттого, что в logger.inc, будучи вложенным в file.php ищет global.inc относительно директории E:\www\root\files, а не E:\www\root\utils\logs

В общем у меня вопрос, как нибудь можно научить php вкладывать файлы строго относительно того где они лежат, а не как были вложены? Что самое обидное мне не помогает даже set_include_path("E:\\www\\root\\utils\\logs") чтобы эта бестия "logger.inc" мог искать относительно своей диретории. Прилагаю архив с искомыми файлами для удобства эксперимента, так сказать.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  root.zip 1,01 Kb


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Royan
Дата 16.12.2007, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Рисунок структуры файлов

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  struct.png 2,37 Kb


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
flashaa
Дата 16.12.2007, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



текущий файл - константа __FILE__,
в logger.inc напиши 

$dir = dirname(__FILE__); 

и получишь свой путь.
Дальше либо пиши require_once($dir . '/../hz.php');

либо сохрани путь в include_path

ini_set('include_path', ini_get('include_path') . ':' . $dir);

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

PM MAIL   Вверх
Royan
  Дата 17.12.2007, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



flashaa, Большое спасибо! Этот способ действительно решает проблему
Но у меня все, же вопрос. Ситуация когда возникает многократная вложенность довольно тривиальна, и я бы не сказал, чтобы она возникала редко. Неужели, предложенный способ есть единственное решение? Неужели в PHP не предусмотрен человеческий способ решения подобной проблемы?


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Vaulter
Дата 17.12.2007, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: 6
Всего: 22





--------------------
PM MAIL WWW ICQ   Вверх
bars80080
Дата 17.12.2007, 10:08 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



с тех пор как я стал все пути делать абсолютными, меня эта проблема не волнует
PM MAIL WWW   Вверх
Feldmarschall
Дата 17.12.2007, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



Royan, никакой проблемы здесь нет. Есть простые правила работы с файловой системой. 
Если ты позвонил приятелю домой по телефону, это не значит, что ты оказался у него дома ,и можешь достать из его холодильника бутылку пива. Сам-то ты у себя дома остался!
Если ты вызвал какой-то файл для выполнения - это не значит, что ты оказался рядом с этим файлом. Ты остался там же, где был. Вот и все.

Цитата(bars80080 @  17.12.2007,  10:08 Найти цитируемый пост)
с тех пор как я стал все пути делать абсолютными, меня эта проблема не волнует 


+100
PM   Вверх
flashaa
Дата 17.12.2007, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



Цитата(bars80080 @  17.12.2007,  10:08 Найти цитируемый пост)
с тех пор как я стал все пути делать абсолютными, меня эта проблема не волнует 

И чем тут хвастаться? Переместил сайт в другую папку и ничего не работает.
Я обычно делаю проекты центрированными по запрашиваемому скрипту.
Т.е. есть у меня index.php, из него вызывается конфиг. скрипт, который просчитывает все пути.

WEB = dirname($_SERVER['SCRIPT_FILENAME']) . '/'; // папка со скриптом

define('LIB', WEB . '/lib/');
define('INC', WEB . '/lib/inc/scripts/');
define('CRON', WEB . '/../cron');

Т.е. проблема возникнет, если внутри проекта файлы перемешивать,  а если целиком перетаскивать - будет шикарно работать.

Это сообщение отредактировал(а) flashaa - 17.12.2007, 11:13
PM MAIL   Вверх
bars80080
Дата 17.12.2007, 11:34 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата
И чем тут хвастаться? Переместил сайт в другую папку и ничего не работает


многоуважаемый Флаша,
абсолютные пути можно начинать с объявленной переменной
Код

$BASE = 'http://'.$_SERVER['HTTP_HOST'].'/new_folder/';
$BASE_DIR = $_SERVER['DOCUMENT_ROOT'].'/new_folder/'; 

изменение всех путей при перемещении сайта в другую папку занимает не больше пяти секунд
PM MAIL WWW   Вверх
flashaa
Дата 17.12.2007, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



Цитата(bars80080 @  17.12.2007,  11:34 Найти цитируемый пост)

изменение всех путей при перемещении сайта в другую папку занимает не больше пяти секунд 

Тогда вообщем претензий нет.
PM MAIL   Вверх
Royan
Дата 17.12.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Vaulter, Спасибо, но эта функция полезна при работе с классами, а у меня речь идет о файлах

Цитата(bars80080 @  17.12.2007,  07:08 Найти цитируемый пост)
с тех пор как я стал все пути делать абсолютными, меня эта проблема не волнует
 Я вас уверяю, к окончанию института (при условии что вы будете продолжать практиковать) вы откажитесь от этого правила. А вот как исключение это действительно полезный прием

Feldmarschall, Пожалуйста, старайтесь говорить по сути из всех слов, что вы сказали ни одно не приблизило вопрос к ответу.

Цитата(flashaa @  17.12.2007,  08:12 Найти цитируемый пост)
Я обычно делаю проекты центрированными по запрашиваемому скрипту.

Если я правильно понял вы объявляете константы для конкретных директорий причем каждая константа содержит в себе абсолютный путь... но тогда необходим файл, который будет вложен во все остальные файлы, чтобы эти константы были доступны везде. В моем случае таким файлом как раз и является global.inc и именно невозможность его вложения является основной проблемой.

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

Код

$parsedUri = dirname($_SERVER['PHP_SELF']);
$parsedUri .= substr($parsedUri, -1) != '/' ? '/' : '';
$relativeUri = str_replace('/', '', $parsedUri);
$relativePath = strlen($parsedUri) - strlen($relativeUri) - 1;
if ($relativePath < 0) {
    $relativePath = 0;
}
$relativePath = str_repeat('../', $relativePath);
if (!$relativePath) {
    $relativePath = './';
}


Тогда секция подключаемых фалов примет примерно такой вид:

Код

require_once "E:\\www\\root\\global.inc"; // abs path
require_once $relativePath. 'foo1.inc';  // rel path
require_once $relativePath. 'foo2.inc';  // rel path
//...


Думаю этот вопрос заслуживает своего места в F.A.Q'е


Это сообщение отредактировал(а) Royan - 17.12.2007, 13:50


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
bars80080
Дата 17.12.2007, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата
Я вас уверяю, к окончанию института (при условии что вы будете продолжать практиковать) вы откажитесь от этого правила

не знаю, институтов не заканчивал, просто работаю web-программером,
согласен не долго, а потому вопрос

почему?
PM MAIL WWW   Вверх
Royan
Дата 17.12.2007, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Цитата(bars80080 @  17.12.2007,  08:34 Найти цитируемый пост)
абсолютные пути можно начинать с объявленной переменной

Действительно это наиболее правильный способ, я подумал о hardcoded путях.

Добавлено через 11 минут и 7 секунд
bars80080, Тут ничего хитрого нет. Во-первых, относительные пути, оставаясь константами, обладают известной динамикой (их не нужно менять при изменении положения проекта). Во-вторых, даже в довольно гибком подходе, описанном вами, сначала происходит чтение переменных из массива, потом происходит конкатенация (до сих пор не нашел эквивалента в русском языке) строк и только после этого происходит обращение к файлу. Вам кажется это пренебрежимо малой операцией? Да так и есть пока проект не достигает определенных размеров с огромным обращением к страницам, на каждой из которых прежде чем отработает основной код отработают подобного рода вычисления абсолютных путей и сервер (железо которого очень часто впору подключать к паровой машине а не к розетке) будет постепенно околевать от нагрузки.


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
bars80080
Дата 17.12.2007, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



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

но:

переменная начала пути вычисляется только один раз при загрузке конфигурации,
далее при подключении, она просто используется,
конкатенация (по-русски, наверное, слипание больше подойдёт) происходит каждый раз где встречается:
include($BASE_DIR.'file.php'); или fopen($BASE_DIR.'file.txt');,
но разве вы не делаете то же самое 
require_once $relativePath. 'foo1.inc';  // rel path
?
мало того, объёмы ваших вычислений на мой взгляд больше

Цитата
их не нужно менять при изменении положения проекта

если не секрет, насколько часто в месяц вы собираетесь менять положение своего проекта?
я меняю только раз - при перемещении с локального хостинга на инетовский

Цитата(Feldmarschall @  17.12.2007,  14:10 Найти цитируемый пост)
твои кавычки к тебе вернулись =) 

если бы использо вались " вместо ' загрузка ресурсов была бы больше

PM MAIL WWW   Вверх
Feldmarschall
Дата 17.12.2007, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



Мне кажется, проблема производительности конкатенации переменных в этой теме несколько  smile  smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0595 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.