Я разрабатываю PHP-программу на MAMP и просто осознал следующее шуточное поведение:
echo "<br/>PATH = ".dirname(__FILE__); include 'include.php';
include.php:
<?php echo "<br/>PATH = ".dirname(__FILE__); ?>
Результат:
PATH = / users / me / stuff / mamp_server / my_site (все строчные буквы)
PATH = / Пользователи / me / Stuff / mamp_server / my_site (смешанный случай)
Что вызывает это непоследовательное поведение и как я могу защитить от него? (Обратите внимание, что я не могу просто преобразовать все в нижний регистр, потому что приложение предназначено для Linux-сервера, где пути к файлам чувствительны к регистру.)
Обновить:
Эта проблема существует для __FILE__
и __FILE__
.
Похоже, что это может быть реальной проблемой, когда нет работы … собираюсь подать отчет об ошибке, если не услышу иначе.
Отчет об ошибке:
https://bugs.php.net/bug.php?id=60017
Обновить:
И еще одно примечание. Если вы делаете абсолютный путь, включите (…) на Mac, для него требуется версия смешанного варианта.
У меня были схожие проблемы с разработкой PHP на MAC OS X. Вы можете форматировать файловую систему, чувствительную к регистру, но если вы используете программное обеспечение Adobe, вы можете столкнуться с проблемой: http://forums.adobe.com/thread/392791
Реальная проблема заключается в том, что файловая система, которая, как говорят, нечувствительна к регистру, на самом деле частично нечувствительна к регистру. Вы можете создать два файла с именами «Filename» и «filename» в том же каталоге, но «Filename» и «filename» могут указывать на оба файла: http://systemsboy.com/2005/12/mac-osx-command- линии является частично-случай-insensitive.html
Как насчет создания файла include в том же каталоге, что и ваше приложение.
<?php return __DIR__; ?>
Используйте его так:
$trueDIR = include('get_true_dir.php');
Из того, что вы разместили выше, это должно сработать. Да, это немного хакерское решение, но это обходной путь, и он должен работать даже на системах, которые не страдают от этой проблемы.
Это код, который я использую, чтобы получить правильную оболочку для определенного имени файла:
function get_cased_filename($filename) { $globbable = addcslashes($filename, '?*[]\\'); $globbable = preg_replace_callback('/[a-zA-Z]/', 'get_bracket_upper_lower', $globbable); $files = glob($globbable); if (count($files)==1) { return $files[0]; } return false; } function get_bracket_upper_lower($m) { return '['.strtolower($m[0]).strtoupper($m[0]).']'; }
Глобус должен соответствовать только одному файлу, но если он используется в файловой системе, чувствительной к регистру, то он может соответствовать большему – требуемое поведение зависит от вас – например, возвратите [0]
или выбросите E_NOTICE
или что-то еще.
Вам может показаться полезным: $mydir = get_cased_filename(dirname(__FILE__));
Работает на моем CLI PHP 5.3.6 на Mac 10.6.8.
Я использую его для общения с коллегами, которые не замечают такие вещи, как «Имя файла» и «имя файла». (Эти люди также задаются вопросом, почему имена файлов, содержащие «>» или «?», Не работают при копировании с Mac на сервер Windows, но я отвлекаюсь …)
Я использовал apache, и я обнаружил, что __DIR__
исполняемого файла тот же, что и в DOCUMENT_ROOT конфигурации apache.
Это означает, что если конфигурация Apache
DocumentRoot /users/me/stuff/my_site
скрипт из вопроса был напечатан:
PATH = /users/me/stuff/my_site (All lower case) PATH = /Users/me/stuff/my_site (Mixed case)
И если в конфигурации apache:
DocumentRoot /Users/me/stuff/my_site
скрипт из вопроса был напечатан:
PATH = /Users/me/stuff/my_site (Mixed case) PATH = /Users/me/stuff/my_site (Mixed case)
Что было намного лучше.
Если вы столкнулись с этой проблемой, проверьте конфигурацию apache, учитывая, что она чувствительна к регистру.