PHP Різниця між повними також відносними шляхами. У файлової системи також на сайті.


твій сайт існує в як би в двох вимірах.
Реальному і віртуальному.

Для всіх відвідувачів - це віртуальний веб-сервер. Який відрізняється, в числі іншого, тим, що на ньому НЕ ІСНУЄ Фото. якщо ти пишеш <a href="http://site.ru/file.html" target="_blank">http://site.ru/file.html - це не файл. Це URI, віртуальний адресу. Ніякого файлу з ім'ям file.html на сервері може взагалі не бути. Це все віртуальні адреси, а не файли.
І браузер працює саме з адресами.

Для розробника же сайт - це програма, що виконується на абсолютно конкретному реальному комп'ютері. З абсолютно конкретним жорстким диском, каталогами та файлами. І скрипт, працюючи зі своїми даними, довантажуючи інші скрипти, працює саме з реальними файлами, на фізичному ДИСКУ.

Ось в цьому відмінності і криються труднощі, з якими часто стикаються новачки.
Втрачають файли, плутають посилання з файлами, звертаються до локальних файлів по протоколу HTTP, або інклюд файли від кореня веб-сервера.

А всього-то треба чітко розуміти дві речі:
1. Розрізняти корінь веб-сервера, як його бачить браузер, і корінь файлової системи на диску.
2. Відмінність відносних шляхів від абсолютних.

Почнемо з другого.
Це дуже просто. Якщо шлях вказується від кореня системи, то це шлях абсолютний. Це як поштову адресу в реальному житті - звідки б ти не йшов, але за точною адресою ти завжди точно знайдеш потрібне місце.
приклади абсолютних шляхів:
/var/www/site/forum/index.php
/img/frame.gif
с:\windows\command.com
/var/www/site/forum/index.php
/img/frame.gif
с:\windows\command.com
У юнікс-системах і на веб сайтах корінь позначається косою рисою - "/".
Це важливо. Це не просто паличка, а самостійний АДРЕСА, шлях.
В адресі http://www.site.ru/ остання коса риска - не для краси! Вона позначає цілком конкретну адресу - початок сайту.
На диску в юнікс системах так само можна набрати "cd /" і ти потрапиш в кореневий каталог.
В Віндоус системах файлова система розбивається по дискам, тому, в абсолютному адресу треба вказувати ім'я диска. Абсолютного кореня всієї файлової системи в Віндоус немає, у кожного диска - свій. Наприклад, C: \ E: \
тому, навіть якщо шлях в Віндоус починається з косою риси, то це не абсолютний шлях, а відносний. Щодо поточного диска. А абсолютний починається з букви.

Якщо на початку шляху коріння не вказати, то цей шлях буде відносним, і він достаівается від поточного положення. У реальному житті це нагадує дорогу до винному магазину - "два квартали наліво і там весь час прямо". Дійти по такому шляху можна тільки з конкретної точки. З іншого ти потрапиш вже в зовсім інше місце.
Найпростіший приклад відносного шляху - це просто ім'я файлу.
Якщо файл знаходиться в тому ж каталозі, з яким працює програма - вона його знайде, додавши поточний шлях до імені файлу.
приклади відносних шляхів:
file.php (фал лежить в тій же папці)
./file.php (фал лежить в тій же папці. такий запис іноді потрібно в деяких юнікс системах)
images/picture.jpg (файл лежить в Капков images, яка знаходиться в поточній)
../file.php (файл лежить в папці, яка розташована на один рівень вище від поточної)
../../file.php (файл лежить в папці, яка розташована на два рівні вище від поточної)

І операційна система, і браузер, зустрівши відносний шлях, добудовують його до абсолютного. але кожен - по-своєму.

Тепер перейдемо до першого пункту.
Різниця кореня веб-сервера, як його бачить браузер, і корінь файлової системи на диску.
В общем-то, з попередніх пояснень вже все повинно бути зрозуміло.
На диску шлях до файлу скрипта може бути таким:
/var/www/site/forum/index.php У той же час, віртуальний адреса цього скрипта при перегляді через браузер, буде:
http://www.site.ru/forum/index.php На цьому прикладі легко побачити, де перетинаються два виміри: у цих двох адрес є загальна частина - /forum/index.php - і вона-то і є причиною плутанини.
Для браузера це найповніший шлях, який тільки може бути. Він починається від кореня сайту.
Для скрипта ж, що виконується на сервері - це всього лише ЧАСТИНА шляху.
для скрипта шлях /forum/index.php виявиться неіснуючим - в корені диска немає каталогу forum!
щоб отримати повний шлях для того, що на сайті виглядає, як /forum/index.php , треба приставити зліва до нього шлях до папки, яка вважається корневаой для всього веб сервера.
в нашому прикладі - це
/var/www/site Цей шлях задається в кофигурации веб-сервера і саме він міститься в системній змінній PHP $_SERVER [ 'DOCUMENT_ROOT' ] $_SERVER [ 'DOCUMENT_ROOT' ]

У віртуальному ж сервері - тому, який бачить користувач - навпаки, немає ніякого диска. Є корінь сайту. Тобто, для того, щоб будь-яке посилання гарантовано працювала, незалежно від того, з якого місця сайту вона викликається, вона повинна бути абсолютною.
Якщо у вас на сайті є, припустимо, два розділи:
http://www.site.ru/about/info.php
і
http://www.site.ru/job/vacancy.php
то, якщо в файлі info.php зробити посилання просто на vacancy.php , то браузер її не знайде - він буде шукати адресу http://www.site.ru/about/vacancy.php , добудовуючи шлях від поточного каталогу.
Тому треба писати повний шлях від кореня сайту - /job/vacancy.php
Все це стосується, природно, не тільки тегів <a> а й <img> і будь-яких інших, де використовуються посилання на інші файли.

Посилання на локальні адреси слід писати без вказівки протоколу і домену - тільки шлях від кореня сайту - /job/vacancy.php . Посилання ж на інші сайти слід писати повністю - http://www.site1.ru/job/vacancy.php .


PHP надає безліч засобів для роботи з файлами, каталогами та URL-ами.

По-перше, це численні зумовлені змінні, які описані в документації і значення яких в своєму скрипті пможно подивившись за допомогою phpinfo() :

Константа __FILE__ містить ім'я поточного виконуваного файлу.
На відміну від PHP_SELF вона містить ім'я файлу, ісполяющегося в даний момент.
дуже корисною є система dirname ( __FILE__ ) dirname ( __FILE__ ) , На яку бажано замінити всі виклики файлів, що знаходяться в тому ж каталозі, що і викликає скрипт. наприклад:
require dirname ( __FILE__ ). "/init.php" функція dirname() , поряд з basename() є одними з найбільш уживаних для роботи з файлами і каталогами.

by phpfaq.ru