Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Напомните плиз, корневая директория (php)

396
10 января 2012 года
SibBear
223 / / 27.07.2006
Есть хитрая причуда в php

толи $_PATH['_FILE_'] то ли как то она писалась, видел в нескольких скриптах не могу вспомнить
Смысл в том, что не высчитывать сколько точек "./dir/" или "../dir/" или "./../../dir" когда идет обращение в папку "вверх", ставится в начале пути...
396
11 января 2012 года
SibBear
223 / / 27.07.2006
все, вспомнил dirname(__FILE__)
но это не то что мне нужно :)
244
11 января 2012 года
UAS
2.0K / / 19.07.2006
$_SERVER["DOCUMENT_ROOT"]
12
11 января 2012 года
alekciy
3.0K / / 13.12.2005
 
Код:
define('ENGINE_ROOT_DIR',   realpath(__DIR__ . '/..') . '/');

Ну или для более старых версий
 
Код:
define('ENGINE_ROOT_DIR',   realpath(dirname(__FILE__) . '/..') . '/');
369
11 января 2012 года
Kesano
451 / / 09.10.2007
+1 к использованию $_SERVER["DOCUMENT_ROOT"];
12
11 января 2012 года
alekciy
3.0K / / 13.12.2005
Цитата: Kesano
+1 к использованию $_SERVER["DOCUMENT_ROOT"];


DOCUMENT_ROOT может порой вести в самые неожиданные места ;)

369
11 января 2012 года
Kesano
451 / / 09.10.2007
На кривых хостингах любая функция может привести в самые неожиданные места...
Так что это не повод не использовать нативные переменные... Если вас на**ывает ваш же сервер - то нужно менять сервер... а не искать костыли...
12
11 января 2012 года
alekciy
3.0K / / 13.12.2005
Цитата: Kesano
На кривых хостингах любая функция может привести в самые неожиданные места...
Так что это не повод не использовать нативные переменные... Если вас на**ывает ваш же сервер - то нужно менять сервер... а не искать костыли...


Костыль ли? О_о
Ну можно юзать и такой подход, бога ради. Каждый разработчик определяем сам, что юзать. Но при том, что свой дедик я настраиваю и поддерживаю полностью сам, все равно DOCUMENT_ROOT не юзаю. И в подконтрольных мне проектах за такое других разработчиков сразу бъю по рукам. Это не значит, что способ плох, он просто имеет ряд недостатков из-за которых для меня его использование неприемлемо.

277
11 января 2012 года
arrjj
1.7K / / 26.01.2011
На кривых руках даже echo может привести в неожиданные места
:trollface:
396
12 января 2012 года
SibBear
223 / / 27.07.2006
Выправляем кривые руки:

Есть два хоста, win и нормальный

define('ENGINE_ROOT_DIR', realpath(__DIR__ . '/..') . '/');

приводит
- win: F:\host\site\www/folder/
- нормальный приводит куда надо.

при использовании header("Location: куданибудь"); этот хедер в приступе экстаза кричит благим матом на win, и совершенно спокойно работает на нормальном хосте.

Вопрос:
как получить не полный путь, а путь в корень сайта только?
или проще поставить str_replace и при нахождении обратного слеша поменять все прямые тоже? тогда win не материться.
но это тоже на дрова похоже...

Кстати, $_SERVER["DOCUMENT_ROOT"] обратный слеш сам меняет на прямой, и получаем
F:/host/site/www/folder/
ващееее.
я в шоке
12
12 января 2012 года
alekciy
3.0K / / 13.12.2005
Тупой копипаст - зло. Тебе стоило посмотреть код и подумать, что там делает каждый кусок. А папка другая потому что у меня document_root эта не та папка, в которй лежит скрипт, скрипт лежит в public, поэтому в пути есть ..

В общем адаптируй под свою ситуацию. Кросс платформеный вариант:
 
Код:
define('ENGINE_ROOT_DIR', realpath(__DIR__ . DIRECTORY_SEPARATOR . '..') . DIRECTORY_SEPARATOR);

Это самый трушный вариант, но я его не использую, поэтому что не веду разработок под винду. Винда для таких целей зло.
12
12 января 2012 года
alekciy
3.0K / / 13.12.2005
Кстати ты, имхо, явно путаешь файловые пути и пути в uri. DOCUMENT_ROOT это файловый путь, не URI ! Нельзя взять и просто захерачить его в URI или header (хотя теоретически на невиндах один вариант есть, когда DOCUMENT_ROOT совпадает с / на сервере, но это мега извращение).
277
12 января 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: alekciy
Кстати ты, имхо, явно путаешь файловые пути и пути в uri. DOCUMENT_ROOT это файловый путь, не URI !



+1 $_SERVER['SERVER_NAME']

396
12 января 2012 года
SibBear
223 / / 27.07.2006
Цитата: alekciy
Тупой копипаст - зло.


согласен! Честно, я даже разобрал по полочкам, то, что давали.
Проблема именно в непонимании путей... пойду читать и эксперементировать.

396
12 января 2012 года
SibBear
223 / / 27.07.2006
слушайте, хоть убейте

если даешт ему путь H:/host/site/images/ или H:\host\site\images\
все работает, инклуды работают, все находит а header не хочет.

если писать просто "/" как корень, header находит но все остальное падает.
Чего я не понимаю? у меня мозг за три дня вскипел...
я пытаюсь понять как сделать пути, что бы они работали на любом хосте в любом уровне
раньше использовал "./" или "../" но как переносить, сиди и думай что куда отправляет
я уже на всех хостах пробую и так и так и не але...
396
12 января 2012 года
SibBear
223 / / 27.07.2006
Короче, я сделал следующее
 
Код:
define('ENGINE_ROOT_DIR', realpath(dirname(__FILE__).DIRECTORY_SEPARATOR.'..').DIRECTORY_SEPARATOR);

header('Location: '.str_replace(ENGINE_ROOT_DIR, '/', $real_img));


в итоге получаю
ENGINE_ROOT_DIR = "H:/host/site/"
$real_img = images/real.jpg

header('Location: /images/real.jpg'));

работает. Везде. но дрова же блин...
12
12 января 2012 года
alekciy
3.0K / / 13.12.2005
Тебе нужны пути для include или для редиректов? Я боюсь ты пытается сейчас смешивать два не связанных друг с другом уровня.

include это файловые пути, редиректы это URI. Если ты из файла-А делаешь include в файл-Б, то все что нужно, это в файле-А прописать относительный путь от файла-А до файла-Б. При этом дабы не возникали проблемы нужно этот относительный путь преобразовать к абсолютному через realpath().

Привожу на примере. Пусть file-1.php лежит в /var/www/example.net/public, а file-2.php в /var/www/example.net/engine/mod. Относительный файловый путь из file-1.php к file-2.php будет ../engine/mod и есть сделать инклюд так:
 
Код:
$file_path = realpath(dirname(__FILE__) . '..' . DIRECTORY_SEPARATOR . 'engine' . DIRECTORY_SEPARATOR . 'mod') . DIRECTORY_SEPARATOR);
include($file_path . 'file-2.php');

то такое включение будет работать и на виндах и на лине при любом document_root сервера. Конечно при условии, что относительный путь от file-1.php к file-2.php не измениться.

Когда эта схема у тебя в голове окончательно и четко устаканиться, то можно начинать думать в сторону таких вещей как единая точка входа (и возможности использования констант в духе ENGINE_ROOT_DIR) и autoload без явного использовать include в коде скрипта.
12
12 января 2012 года
alekciy
3.0K / / 13.12.2005
Цитата: SibBear
Короче, я сделал следующее
 
Код:
define('ENGINE_ROOT_DIR', realpath(dirname(__FILE__).DIRECTORY_SEPARATOR.'..').DIRECTORY_SEPARATOR);

header('Location: '.str_replace(ENGINE_ROOT_DIR, '/', $real_img));


в итоге получаю
ENGINE_ROOT_DIR = "H:/host/site/"
$real_img = images/real.jpg

header('Location: /images/real.jpg'));

работает. Везде. но дрова же блин...


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

396
12 января 2012 года
SibBear
223 / / 27.07.2006
Цитата: alekciy
include это файловые пути, редиректы это URI


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

271
13 января 2012 года
MrXaK
721 / / 31.12.2002
редиректов не существует.. для тебя (сервера)
файловых путей не существует.. для пользователя (сайта)

если у тебя какая-то либа, которую надо инклудить, и она инклудится больше чем в одном проекте - вынеси её в общее место, во всех проектах бери это общее месте из конфига, который задаётся каким-нибудь универсальным define() в каком-нибудь config.inc.php или в каком-нибудь .ini, неважно... пользователю сайта вообще никогда не надо знать, где это у тебя лежит

если у тебя "файл", который надо показывать, то все ссылки/редиректы не должны вообще зависеть от того, откуда у тебя это запускается (от физического пути), они должны зависеть от адреса, по которому заходит клиент, то есть http://someserv/, или твой http://localhost/, неважно.. твои скрипты вообще не волнует, куда тебя будет директить относительно файловой системы... файл в кавычках, потому что там может быть что угодно, те же чпу, реврайты, виртуалхосты и т. п... в принципе лично я корень этого пути тоже жёстко забиваю в .iniшку проекта, хотя так делать не стоит))) просто переезжает домен - меняется одна строка, переезжает хост на другого хостера - меняется другая строка, переезжает всё - строки меняются вместе))
369
13 января 2012 года
Kesano
451 / / 09.10.2007
Лично мне не интересно использовать dirname(__FILE__) по одной простой причине: Я не хочу думать, из какой директории я вынимаю либу или что-то еще... Я иду в корень сайта и от него шагаю по известному пути...
Что $_SERVER["DOCUMENT_ROOT"], что header("Location: ...") - всё работает нормально на виндах и на разных хостингах...

P.S. ну а если кто-то использует header('Location: ..'); как:
 
Код:
header('Location: '.$_SERVER["DOCUMENT_ROOT"].'/folder/file.php');

то что я могу сказать... http://www.php.su
12
14 января 2012 года
alekciy
3.0K / / 13.12.2005
Цитата: Kesano
Лично мне не интересно использовать dirname(__FILE__) по одной простой причине: Я не хочу думать, из какой директории я вынимаю либу или что-то еще... Я иду в корень сайта и от него шагаю по известному пути...
Что $_SERVER["DOCUMENT_ROOT"], что header("Location: ...") - всё работает нормально на виндах и на разных хостингах...

P.S. ну а если кто-то использует header('Location: ..'); как:
 
Код:
header('Location: '.$_SERVER["DOCUMENT_ROOT"].'/folder/file.php');

то что я могу сказать... http://www.php.su


Tru way: document_root через единую точку входа index.php в котором задан dirname(__FILE__) и вот уже оттуда "и от него шагаю по известному пути". Все остальное от лукового.

369
14 января 2012 года
Kesano
451 / / 09.10.2007
Цитата: alekciy
Tru way: document_root через единую точку входа index.php в котором задан dirname(__FILE__) и вот уже оттуда "и от него шагаю по известному пути". Все остальное от лукового.



ММммм... Ну, если так подумать - то да... Это резонно когда в разных каталогах разные движки и точки входа..

396
14 января 2012 года
SibBear
223 / / 27.07.2006
Цитата: Kesano
ММммм... Ну, если так подумать - то да... Это резонно когда в разных каталогах разные движки и точки входа..



А теперь совсем на пальцах можете показать пример?
только объяснить где что?
у меня так и получается, нужно найти вход из скрипта, который находится незнама где, а от туда пойти "3 квартала прямо, и налево".
причем этот скрипт может быть как в корне, так и в какой то папке ниже document_root .

369
14 января 2012 года
Kesano
451 / / 09.10.2007
ну смотри...
У тебя есть http://www.site.ru
Когда заходишь на http://www.site.ru/myblog/ ты попадаешь в свой блог, который написан на отдельном мини-движке..
А когда заходишь на http://www.site.ru/shop/ ты попадаешь в магазин, который написан совсем на другом движке...
В тебя в каждом каталоге (майблог и шоп) есть myblog.php (shop.php) и .htaccess, и все запросы глубже ты перенаправляешь на *module*.php ( RewriteRule ^/shop/(.*)$ shop.php?url=$1 и RewriteRule ^/myblog/(.*)$ myblog.php?url=$1 )...

В первом случае у тебя точка входа /shop/shop.php а во втором /myblog/myblog.php .
Если ты в точке входа вызовешь $root = dirname(__FILE__); то тебе вернет путь до точки входа (например /home/sibbear/sitr.ru/www/shop )
А если вызовешь $root = $_SERVER["DOCUMENT_ROOT"]; то тебе вернет путь до корня сайта ( например /home/sibbear/sitr.ru/www/ )

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

Допустим:
У тебя есть такая структура внутри shop: includes/classes/lib.php
и ты подключаешь файлы так: include($root."/includes/classes/lib.php");
Если ты ты вернул $root = dirname(__FILE__); то путь у тебя будет правильным, /home/sibbear/sitr.ru/www/shop/includes/classes/lib.php )
А если $root = $_SERVER["DOCUMENT_ROOT"]; то получишь фаталку: /home/sibbear/sitr.ru/www/includes/classes/lib.php потому что такого пути в лучшем случае не существует

Типа гуру юзают dirname(__FILE__) для того, чобы не париться потом, в каком каталоге у них точка входа, главное чтобы ниже структура сохранялась...

Еще один пример: грёбаный Смарти... его можно запихнуть куда угодно:
/home/sibbear/site.ru/www/includes/libs/Smarty.class.php
И чтобы смарти не гадал, по какому же пути от корня сайта находятся его либы ( plugins ) , он использует dirname(__FILE__) в Smarty.class.php и не парит себе мосх...

 
Код:
if (!defined('DS')) {
    define('DS', DIRECTORY_SEPARATOR);
}

if (!defined('SMARTY_DIR')) {
    define('SMARTY_DIR', dirname(__FILE__) . DS);
}

А DIRECTORY_SEPARATOR возвращает / или \ в зависимости от того, на какой ОС работает PHP
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог