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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Относительный путь и текущая папка, В 5-м PHP стало работать по-другому.. :( 
V
    Опции темы
Vitalik
Дата 1.8.2007, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

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



Здравствуйте!..

Возникла такая проблема..

Есть проект, находящийся в папке /htdocs/project/
Стартовый файл: /htdocs/project/index.php
Внутри файла index.php инклудится файл /htdocs/project/sub1/sub2/somefile.inc
Код
Файл index.php:
  ...
  include('sub1/sub2/somefile.inc')
  ...

Внутри файла sub1/sub2/somefile.inc необходимо инклудить файл, находящийся в родительской папке, то есть к примеру файл sub1/need_to_incude.inc
Раньше я делал так:
Код
Файл sub1/sub2/somefile.inc:
  ...
  include('../need_to_incude.inc');
  ...
И все работало прекрасно. Но теперь почему-то PHP ищет файл need_to_incude.inc в родительской папке не по отношению к файлу somefile.inc, а по отношению к файлу index.php. Таким образом оно хочет инклудить файл /htdocs/need_to_incude.inc, а не /htdocs/project/sub1/need_to_incude.inc :(

Уже есть очень много файлов в папке sub1, и много папок вида sub2 с многими файлами внутри, которые инклудят эти первые файлы из папки sub1. Поэтому менять везде короткий относительный путь на полный абсолютный совсем не хочется.. Еще этого не хочется делать потому как при составлении этих файлов хочется чтобы они выглядели компактнее, тогда с ними удобнее работать..
PM MAIL WWW ICQ YIM   Вверх
mishaSL
Дата 1.8.2007, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Vitalik, посмотри что указано в директиве include_path
Код

print get_include_path();


Для справки:
Код

include_path string

    Специфицирует список директорий, где функции require(), include() и fopen_with_path() ищут файлы. Формат напоминает системную переменную окружения PATH: список директорий, разделённых двоеточием в UNIX или точкой запятой - в Windows.
    Пример UNIX include_path

    include_path=.:/home/httpd/php-lib

    Пример Windows include_path

    include_path=".;c:\www\phplib"

    Значение по умолчанию:  . (только текущая директория). 



Цитата(Vitalik @  1.8.2007,  18:44 Найти цитируемый пост)
Еще этого не хочется делать потому как при составлении этих файлов хочется чтобы они выглядели компактнее, тогда с ними удобнее работать.. 

ИМХО, гораздо удобнее работать с абсолютными путями. Объявляешь в конфигурационном файле путь до проекта, а дальше при инклюде только дописываешь эту переменную.


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
Всемогущий
Дата 1.8.2007, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 5
Всего: 13



Мне кажется можно использовать такой метод:

после каждого инклуда автоматически  добавлять абсолютный адресс в include_path 


--------------------
Цитата(smartov @  16.1.2007,  13:26 Найти цитируемый пост)
Видел я PHP код, который пишут наСильники, никогда на php не писавшие  :D  То еще зрелище. Все пытаются сделать руками и через ж (как в С привыкли). Все пытаются память освобождать итд итп. 
PM MAIL ICQ   Вверх
mishaSL
Дата 1.8.2007, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Какой-то странный метод. Может я не понял, можно пример?


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
Всемогущий
Дата 2.8.2007, 04:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 5
Всего: 13



заменяем include на myinclude

Код

function myinclude($path){

         $temp=explode (PATH_SEPARATOR,get_include_path () );

         $temp[]=dirname(realpath (__FILE__));

         $otvet=implode (PATH_SEPARATOR, $temp) ;

         set_include_path ( $otvet ) ;

         return   include($path) ;



}


Это сообщение отредактировал(а) Всемогущий - 2.8.2007, 04:38


--------------------
Цитата(smartov @  16.1.2007,  13:26 Найти цитируемый пост)
Видел я PHP код, который пишут наСильники, никогда на php не писавшие  :D  То еще зрелище. Все пытаются сделать руками и через ж (как в С привыкли). Все пытаются память освобождать итд итп. 
PM MAIL ICQ   Вверх
Fally
Дата 2.8.2007, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 4



Vitalik, Попробуй вот так:
Код

include('./sub1/sub2/somefile.inc')



--------------------
Прежде чем задать вопрос на форуме воспользуйтесь поиском.
user posted image
user posted image
PM MAIL   Вверх
Vitalik
Дата 3.8.2007, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

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



Большое спасибо всем ответившим  smile 

Простого решения этой проблемы, наверное, действительно нет..
Вполне возможно, что в PHP5 просто текущей директорией считается та, в которой находится самый первый "вызывающий" php-скрипт. А PHP4 по видимому текущей директорией была та, в которой находится текущий выполняемый php-скрипт (который мог быть инклуден в другой, в "вызывающий")..

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

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

Еще раз спасибо за попытки помочь!  smile 
PM MAIL WWW ICQ YIM   Вверх
Mal Hack
Дата 3.8.2007, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

Репутация: 122
Всего: 261



Есть более простой путь и более правильный.
Во всех include'ах, fopen'ах, пишем полный путь /home/www/..../file.php.
Дабы  избавиться от лишних правок, корень выносится в константу, которая в include конкатенируется с именем и путем файла от корня, т.е. в данном случае include(DIR."/sub2/include.php");
PM ICQ   Вверх
Vitalik
Дата 3.8.2007, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

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



В принципе ведь, если написать
Код
include("sub2/include.php")
, то эффект будет тем же.. Путь ведь относительный.. Но тогда мне хотелось, чтобы он был еще относительней, и не привязывался даже к этому "корню".. Да и чтобы короче все выглядело и проще.. А то переименуешь вдруг папочку sub2 или еще какую, так сразу нужно будет во всех внутренних файлах инклуды менять..

Кстати, вопрос может быть немножко не в тему, но все же..
Файлы, которые инклудятся принято делать с расширением inc или не стоит так делать и лучше, чтобы у всех было php?..
PM MAIL WWW ICQ YIM   Вверх
Mal Hack
Дата 3.8.2007, 16:38 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

Репутация: 122
Всего: 261



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

Лучше - php.
PM ICQ   Вверх
sTa1kEr
Дата 3.8.2007, 19:16 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Vitalik, если хотите использовать относительные пути, то лучше всего подойдет такая конструкция
Код

include(dirname(__FILE__)."/include.php");

Т.е. для инклюда путь будет абсолютным, а для вас относительным.

Цитата(Vitalik @  3.8.2007,  16:26 Найти цитируемый пост)
Файлы, которые инклудятся принято делать с расширением inc или не стоит так делать и лучше, чтобы у всех было php?

Не советую использовать расширение inc. Т.к. по умолчанию такой файл будет интерпретироваться апачем как текстовый, что может привести к проблеме в безопасности. В крайнем случае лучше использовать inc.php. 
PM MAIL   Вверх
Vitalik
Дата 3.8.2007, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

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



Цитата(Mal Hack @  3.8.2007,  15:38 Найти цитируемый пост)
Лучше - php.

Можно дурацкий вопрос?.. Чем лучше расширение php?..
Просто я вот как-то раньше думал, что логичнее выглядит, если php - это файлы, которые могут быть запущены отдельно, а inc - это файлы, которые имеют смысл только если их инклудить..
Но вот недавно услышал такую вещь, что лучше использовать всегда php из-за того, что при загрузке из браузера php-код никогда виден не будет, а inc'овские файлы могут загрузиться как текстовые показав клиенту весь свой исходный код..
Есть ли еще какие-то причины не использовать расширение inc?.. user posted image

Добавлено через 3 минуты и 33 секунды
sTa1kEr, пасибки smile
Пока я набивал сообщение (пару раз приходилось отходить надолго) вы уже написали похожий ответ (про inc-файлы), спасибо smile
PM MAIL WWW ICQ YIM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

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

Важно:

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

Внимание:

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

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

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


 




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


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

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