Случайная несогласованность путей файлов PHP на Mac / MAMP?

Я разрабатываю 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, для него требуется версия смешанного варианта.

Solutions Collecting From Web of "Случайная несогласованность путей файлов PHP на Mac / MAMP?"

У меня были схожие проблемы с разработкой 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, учитывая, что она чувствительна к регистру.