Проблема пути PHP с учетом регистра

Я запускаю PHP-приложение SocialEngine, которое я недавно перенес на другой сервер.

И с этого момента - возникает проблема:

Ядро SocialEngine пытается включить файлы в нечувствительные к регистру пути, которых не существует (хотя в правильном случае они существуют)

Как я могу заставить PHP/Apache работать лучше, а также искать в других случаях?

Например, SocialEngine ищет /application/modules/Menuitems.php, а правильный путь — /application/modules/Menu**I**tems.php.

Подводя итог: мне нужны пути без учета регистра!


person imriqwe    schedule 30.10.2011    source источник
comment
Добро пожаловать в СО. Пожалуйста, смотрите FAQ о том, какие вопросы задавать. Только потому, что вы чего-то хотите, не означает, что у вас есть вопрос. Во-вторых, вам нужно сделать некоторые основные вещи самостоятельно, например. получите компьютерный класс об операционной системе сервера, в которую вы скопировали приложение, чтобы узнать больше.   -  person hakre    schedule 31.10.2011
comment
Вы были на сервере Windows раньше или что-то в этом роде? Практически каждый путь в системах *nix чувствителен к регистру.   -  person Amber    schedule 31.10.2011
comment
Если вы мигрировали с хоста Windows на хост Linux, вам, вероятно, не повезет. Это операционная система, разрешающая эти пути к файлам, а не PHP, и, как правило, пути к файлам, отличным от Win, чувствительны к регистру.   -  person Michael Berkowski    schedule 31.10.2011
comment
stackoverflow.com/questions/3964793 /   -  person Steve    schedule 31.10.2011
comment
Хакре, чего ты хочешь? Я ненавижу тех, кто пытается преподать урок, говоря как эксперты...   -  person imriqwe    schedule 31.10.2011
comment
Я задал вопросы, в чем твоя проблема?   -  person imriqwe    schedule 31.10.2011
comment
@Imri: Вот почему я предложил тебе посетить компьютерный класс. На компьютере, на который вы скопировали файлы, наверняка не будет того, что вам нужно. Узнайте об этом, живите с этим. Но никто не может это изменить.   -  person hakre    schedule 31.10.2011
comment
Не говорите мне ходить на компьютерные курсы, потому что если бы я мог это сделать, я бы это сделал. Мне не нужны ваши неуместные советы. Если вы не можете или не хотите конкретно мне помочь, просто не отвечайте здесь.   -  person imriqwe    schedule 31.10.2011
comment
Привет, @Imri, такое отношение ненависти здесь, в SO, недопустимо. Это бесплатная услуга, и МЫ добровольно помогаем ЛЮДЯМ, подобным вам. Кроме того, ваша проблема вызвана разницей в том, как каждая ОС работает внутри в отношении пути к файлу. Если вы этого не знаете, следуйте совету Хакре, получите компьютерный класс или изучите ОС, которую вы используете, чтобы понять это. Опять же, мы работаем добровольно.   -  person ariefbayu    schedule 31.10.2011
comment
Спасибо за ваш ответ. Я не собирался ничего требовать. Но я просто не понимаю, почему на мой самый первый вопрос он нападает на меня. Может быть, у меня нет необходимых знаний для решения проблемы, но он мог бы объяснить, что я плохо спрашиваю. Если бы был класс, связанный с этой проблемой, я бы взял его. Еще раз спасибо за ваш ответ.   -  person imriqwe    schedule 31.10.2011
comment
@hakre имел в виду, что вам нужно понять, как файловые системы понимают пути, которые различаются для каждого типа ОС (во многих случаях). Это означает, что вы упускаете ключевую точку зрения, которая затрудняет решение этой конкретной проблемы. Некоторые операционные системы требуют точного регистра, некоторые нет, но вам нужно понимать разницу, если вы собираетесь переносить свой код с одной на другую.   -  person Jared Farrish    schedule 31.10.2011
comment
@hakre - Не уверен, что у тебя плохой день, но это был контрпродуктивный комментарий. Обычно ты так не отвечаешь, и мне обычно нравится читать твои ответы, поэтому я предполагаю, что у тебя не очень хороший день. Я не думаю, что ОП что-то имел в виду. :)   -  person Jared Farrish    schedule 31.10.2011
comment
@hakre - я никогда в жизни не посещал компьютерные курсы, и я полагаю, вы могли бы привлечь меня к ответственности за мои знания компьютера, ОП может не понимать всего, что связано с проблемой. Я гарантирую вам, что ОП не понимает ТАК, если они новые (кто действительно понимает?). Если что-то знаете, дайте ответ, если нет, то давай. Будь добрым. Мы все были там в одно время.   -  person Jared Farrish    schedule 31.10.2011
comment
@hakre - Вам не нужен компьютерный курс, чтобы понять, как файловая система получает доступ к пути, вам просто нужны знания. Этот сайт посвящен ответам на вопросы. Честно говоря, уровень понимания ОП вторичен по отношению к этому.   -  person Jared Farrish    schedule 31.10.2011
comment
@JaredFarrish: теперь я решил вместо этого добавить ответ, это был просто комментарий, извините, если это кого-то оскорбило, это не имелось в виду.   -  person hakre    schedule 31.10.2011


Ответы (3)


У вас есть нечувствительные к регистру пути в окнах. Но когда вы перемещаете свою страницу в Linux, путь будет чувствителен к регистру. Вы можете создать функцию для пути сборки, которая преобразует все буквы в верхний или нижний регистр (часто предпочтительнее) и использовать один из этих нормализованных стилей именования для имен каталогов и файлов.

person radeklos    schedule 31.10.2011
comment
Важное замечание, которое стоит запомнить, особенно при перемещении файлов из Windows в Linux! - person Grant_Bailey; 22.02.2015

Вы можете поэкспериментировать с этим кодом, я оставил только пару шагов TODO (извините! нет времени... и он слишком большой, чтобы поместить его в качестве комментария), который вы можете выполнить. Вы помещаете этот код в самое начало файла index.php, и каждый раз, когда включение не удается, вызывается имя correctFile.

Вы должны протестировать его отдельно, так как он получает имя файла из предупреждения, которое возвращает php. Моя версия php возвращает имя файла в скобках, не знаю вашего. Протестируйте код, чтобы увидеть, как он работает.

<?PHP
/*****************put this at the very top*********************************/
 $flag=2; 
 function correctFileName($incorrectFileName)
 {
    //directory and file to look at/for
    $dirToLookAt = dirname($incorrectFileName);
    $fileToLookFor = basename($incorrectFileName);

    //get all .php files
    $files = array(); $directory = opendir($dirToLookAt ); 
    while($item = readdir($directory)) 
        if(is_string(strstr($item,'.php')))
            $files[] = $item; 

    //to do
    /*
    loop through the $files array and to 
    a case insensitive search for $incorrectFileName

    if you find one then rename the file you found to $incorrectFileName

    then break the loop
    */

 }
//error handler function
function customError($errno, $errstr)
  {
        global $flag;
        //find the file name
        if($errno==2 and (($flag%2)==0))
        {
              //this will allow to enter only once per time
              $flag++;
              //get the file name
             $start = strpos($errstr, '(') +1;//7
             $length = strpos($errstr, ')') -  $start ;//10
             correctFileName(substr($errstr, $start  ,$length));
        }
  }

//set error handler
set_error_handler("customError");
/*****************************************************************/

//trigger error
include 'c:\www\home\122221.php'; 
?>

Также код делает предположение, что имя части каталога правильное! в противном случае вы должны управлять этим тоже.

person Melsi    schedule 31.10.2011

Как уже говорилось в комментариях (извините, если вы обиделись, это не имелось в виду) выше и один данный ответ есть фундаментальная проблема:

Имена файлов, используемые приложением, недействительны. Их не было в вашей системе Windows, но они есть в Linux.

Это трудно решить. Однако у меня возникла следующая идея: PHP StreamWrapper.

Stream Wrappers взаимодействуют между именами файлов и базовым кодом. Они позволяют получать доступ к URL-адресам и файлам с одним и тем же интерфейсом, например. include или file_get_contents.

Обычно тип потока (и на который вы можете зарегистрировать свою собственную оболочку) начинается с чего-то вроде protocol://.

Если протокол не указан, это file://.

Итак, вы можете попробовать создать свою собственную оболочку потока, которая регистрируется в протоколе file://. Затем вы можете решить проблемы с чувствительностью к регистру.

В руководстве содержится предварительно сделанное определение класса потоковой оболочки, которое вы может захотеть использовать повторно.

Другие дали подсказки и код, как решить проблемы с чувствительностью к регистру. Обычно вам нужно иметь дело только с операциями чтения в вашем случае.

person hakre    schedule 31.10.2011