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
Коментарі
Коментуючи, пам'ятайте про те, що зміст і тон Вашого повідомлення можуть зачіпати почуття реальних людей, проявляйте повагу та толерантність до своїх співрозмовників навіть у тому випадку, якщо Ви не поділяєте їхню думку, Ваша поведінка за умов свободи висловлювань та анонімності, наданих інтернетом, змінює не тільки віртуальний, але й реальний світ. Всі коменти приховані з індексу, спам контролюється.