PHP чувствительная к регистру проблема - PullRequest
1 голос
/ 31 октября 2011

У меня работает приложение SocialEngine PHP, которое я недавно перенес на другой сервер.

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

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

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

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

Подводя итог: я хочу регистры без учета регистра!

Ответы [ 3 ]

4 голосов
/ 31 октября 2011

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

0 голосов
/ 31 октября 2011

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

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

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

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

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

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

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

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

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

0 голосов
/ 31 октября 2011

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

Вы должны проверить его отдельно, хотя он получает имя файла из предупреждения, что 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'; 
?>

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

...