Кажется, я не могу заставить функцию realpath работать с переменными, есть ли способ исправить это? Когда я использую переменные в функции, она ничего не возвращает. Я знаю, что путь работает без функции realpath, но я хочу использовать функцию realpath с моим именем пути.
realpath('./members/' . $userId . '/images/thumbs/' . $image);
Отредактируйте реальный маршрут.
http://localhost/Project/members/24/images/thumbs/avatar.png
Ну, это еще не закончено, но идеально подходит …
Посмотрите. Ваш сайт живет в двух сферах одновременно: реальный и виртуальный.
Для пользователей сайта это виртуальный веб-сервер, и вы должны понимать очень важную вещь: на веб-сервере нет файлов . Представьте, что вы вводите http://example.com/index.html
в адресной строке. Это не файл или путь, а URL-адрес, HTTP-ресурс. Виртуальный адрес, полностью отличный от обычного файла.
Хотя для вас, как разработчика сайта, веб-сервер представляет собой программу, запущенную на компьютере. На этом компьютере, скорее всего, есть жесткий диск и файловая система. Ваш PHP-скрипт, работая с данными или включая другие скрипты, управляет файлами на физическом диске.
Такая разница – очень распространенная ловушка для начинающих.
Многие из них путают файл с гиперссылкой, пытаясь вызвать локальный файл с использованием протокола HTTP или включать файл с использованием виртуального пути из корня веб-сервера.
Более того, есть две вещи, которые препятствуют правильному пониманию:
Будьте осторожны и не позволяйте им обманывать вас.
Ну, ведь это не ракетостроение. Просто нужно понять эти три вопроса:
root
вещь и какая разница между корневой файловой системой и корнем веб-сервера Первый можно легко отличить:
Файл принадлежит файловой системе. Это часть данных, хранящихся на жестком диске. Он имеет несколько атрибутов, таких как размер, время модификации, владелец, разрешения и т. Д. Это явно атрибуты файловой системы, нет ресурсов HTTP.
Оба файла данных и ваши сценарии являются файлами и должны рассматриваться как таковые. Если вы делаете что-то вроде include 'http://yoursite.com/file.php';
, вы не включаете PHP-код, как ожидалось, а просто обычный HTML – результат выполнения file.php!
Если вы хотите прочитать имена изображений из каталога, не читайте его с http://yoursite.com/image/
. Это не каталог.
С другой стороны, HTTP-ресурс – это протокол HTTP-протокола. Ваш веб-сервер – это демон, который слушает запросы. Получив запрос на определенный ресурс, идентифицированный URI, он ищет этот ресурс, и (если найден) возвращает его содержимое, сопровождаемое несколькими заголовками HTTP .
Веб-сервер имеет собственную структуру каталогов, но очень важно понять, что эта структура каталогов является виртуальной. Он просто напоминает реальную файловую систему, но это вовсе не файловая система. /dir/
, /dir/file.ext
, /dir/whatever
– в то время как все эти пути выглядят иначе, они все одинаковы. Это сложный вопрос, но очень важный для понимания. В HTTP нет файлов или каталогов. Но только ресурсы , состоящие из заголовков и тела. Если вы запрашиваете /dir/
URI с сервера, вы получаете заголовки и тело. Если вы запрашиваете URI /dir/file.ext
с сервера, вы получаете заголовки и тело. Каждый раз, когда вы запрашиваете что-то с сервера, вы получаете заголовки и тело. Единственное исключение – ответ, который включает заголовки, но не тело.
Хотя некоторые ресурсы могут напоминать файлы, они не являются файлами. У них нет атрибутов, но заголовков. Это действительно другое царство. Конечно, большинство веб-серверов времени просто находят физический файл, соответствующий запрошенному URI, и выводят его. Но это не файл, а только содержимое файла, предшествовавшее некоторые заголовки. Да – вот в чем разница: наиболее важно различать файл как предмет файловой системы и его содержимое. Если вы запрашиваете то, что выглядит как каталог, вы получаете на самом деле … код HTML! Очень важно различать каталог с точки зрения HTML-кода файловой системы, которому предшествуют некоторые заголовки. (Конечно, вы можете получить не HTML, а некоторое содержимое двоичного файла – это всего лишь вопрос заголовка Content-type. Еще одна причина не путать реальный мир с виртуальным)
Вывод:
Если вы хотите, чтобы ваш скрипт напрямую обращался к файлу – адресуйте его как файл. Не называйте это через HTTP! (Обратите внимание, что ваши php-скрипты являются файлами 😉
Если вы хотите, чтобы один и тот же файл был доступен клиенту с использованием протокола HTTP, обратитесь к нему как к виртуальному ресурсу.
Ну, корень – это корень. Отправная точка. Место, где все начинается.
И файловая система, и веб-сервер имеют свои корни.
В системах Unix корневой файловой системой является /
. Обратите внимание, что это не просто разделитель каталогов! Если путь начинается с этого символа, это имя конкретного каталога – корневого. Каждый другой файл и каталог принадлежит root. В системе Windows это довольно грязно (как обычно). Нет общего корня файловой системы, но отдельные диски с его собственными корнями. Он начинается с буквы диска и обратной косой черты: C:\
является корнем диска C.
У веб-сервера есть собственный root. Место, где виртуальный мир встречается с реальным. С точки зрения сервера, root веб-сервера (часто называемый DOCUMENT_ROOT) представляет собой каталог файловой системы, где веб-сервер ищет файлы, представляющие ресурсы HTTP. Для клиента это полный квалифицированный корень – место, где начинается веб-сайт. Он выглядит как Unix-system root – /
. Клиент ничего не знает о файловой системе сервера. Для клиента это /
является единственным корнем.
Вывод:
Всегда знайте, где находится ваш корень. Для веб-сервера это просто: всегда /
. Для файловой системы известно, что виртуальный корень соответствует реальному миру – DOCUMENT_ROOT. Это поможет вам найти ваши собственные файлы .
Это просто. Фактически, только абсолютные пути реальны. В то время как относительные можно вообразить, и каждый относительный путь всегда переводится в аномальный, прежде чем использовать. Абсолютный путь неразрывно связан с root
. По сути, абсолютный путь – это путь, построенный из корня:
Как вы можете видеть, первые два являются файловыми путями, из unix и windows соответственно, в то время как третий не может быть четко определен, но, скорее всего, является виртуальным HTTP-ресурсом.
Каждый путь, который не включает корневую директиву, является относительным. Он создается из текущего местоположения :
Вывод :
Всегда используйте абсолютные пути, когда это возможно. Он недвусмыслен и работает везде, независимо от текущего каталога. Он может содержать переменную часть, чтобы она работала в разных средах, но в конце она всегда должна быть абсолютной.
Действительно ли путь существует? Что касается функции realpath , путь должен быть действительным и существующим.
Поэтому, если вы используете .htaccess для создания «псевдо» путей, функция realpath не будет работать на них. Использование переменных внутри не должно иметь значения (учитывая, что они заполняются в порядке и правильны), поскольку все, что это действительно требует, является допустимой строкой.
realpath () возвращает FALSE при сбое, например, если файл не существует.
http://php.net/realpath
Проверьте свои переменные, чувак