Несовместимость регистров путей к файлам PHP на Mac / MAMP? - PullRequest
23 голосов
/ 08 октября 2011

Я занимаюсь разработкой 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 = / Users / me / Stuff / mamp_server /my_site (смешанный случай)

Что является причиной этого противоречивого поведения и как я могу защитить от него?(Обратите внимание, что я не могу просто преобразовать все в нижний регистр, потому что приложение предназначено для сервера Linux, где пути к файлам чувствительны к регистру.)

Обновление:

Эта проблема существует для __FILE__ и __DIR__.

Похоже, что это может быть реальной проблемой, если не обходить стороной ... собираюсь подать отчет об ошибке, если я не услышу иначе.

Отчет об ошибке:

https://bugs.php.net/bug.php?id=60017

Обновление:

И еще одно примечание: если вы используете абсолютный путь, включающий (...) на Mac, он требуетверсия со смешанным регистром.

Ответы [ 4 ]

2 голосов
/ 24 октября 2011

У меня были похожие проблемы при разработке PHP на MAC OS X. Вы можете отформатировать с использованием чувствительной к регистру файловой системы, но если вы используете дизайнерское программное обеспечение Adobe, у вас могут возникнуть проблемы: http://forums.adobe.com/thread/392791

Реальная проблема заключается в том, что файловая система, которая называется нечувствительной к регистру, на самом деле частично нечувствительна к регистру. Вы можете создать два файла с именами «Имя файла» и «Имя файла» в одном и том же каталоге, но «Имя файла» и «Имя файла» могут указывать на оба файла: http://systemsboy.com/2005/12/mac-osx-command-line-is-partially-case-insensitive.html

1 голос
/ 01 декабря 2011

Это код, который я использую, чтобы получить правильный регистр для заданного имени файла:

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, но я отвлекся ...)

1 голос
/ 20 октября 2011

Как насчет создания включаемого файла в том же каталоге, что и ваше приложение.

<?php return __DIR__; ?>

Используйте его так:

$trueDIR = include('get_true_dir.php');

Из того, что вы опубликовали выше, это должно работать.Да, это немного хакерский обходной путь, но это обходной путь, и он должен работать даже на системах, не страдающих от этой проблемы.

0 голосов
/ 19 августа 2014

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

...