Я запускаю приложение SocialEngine PHP, которое недавно перенесло на другой сервер.
И с этого момента – возникает проблема:
Ядро SocialEngine пытается включить файлы в нечувствительные к регистру пути, которые, как представляется, не существуют (хотя в правильном случае они существуют)
Как я могу заставить PHP / Apache действовать лучше, а также искать в других случаях?
Например, SocialEngine ищет /application/modules/Menuitems.php
, а правильный путь – /application/modules/Menu**I**tems.php
.
Подводя итог: я хочу нечувствительные к регистру пути!
У вас есть незаметные пути в окнах. Но когда вы перемещаете свою страницу на linux-путь, регистр будет чувствителен к регистру. Вы можете создать функцию для пути построения, которая преобразует все буквы в верхний или нижний регистр (часто это предпочтительнее) и используйте один из этих нормализованных стилей именования для имен каталогов и файлов.
Вы можете поэкспериментировать с этим кодом. Я оставил только пару шагов 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'; ?>
Также в коде делается предположение, что имя каталога верное! в противном случае вы тоже должны это сделать.
Как уже говорилось в комментариях (я сожалею, если вы оскорблены, не имел в виду именно так) выше, и один из ответов дал фундаментальную проблему:
Имена файлов, которые использует приложение, являются недопустимыми. Они не были в вашей системе Windows, но они на Linux.
Это трудно решить. Однако у меня была следующая идея: PHP StreamWrapper
.
Обтекатели потоков взаимодействуют между именами файлов и базовым кодом. Они позволяют получать доступ к URL-адресам и файлам с одним и тем же интерфейсом, например include
или file_get_contents
.
Обычно тип потока (и на который вы можете зарегистрировать свою собственную оболочку) начинается с чего-то вроде protocol://
.
Если протокол не указан, это file://
.
Итак, вы можете попробовать создать собственную поточную оболочку, которая регистрируется в file://
protocol. Затем вы можете решить проблемы чувствительности к регистру.
В руководстве содержится предварительное определение класса stream-wrapper, который вы, возможно, захотите повторно использовать.
Другие дали подсказки и код, как решить проблемы чувствительности к регистру. Обычно вам нужно иметь дело с операциями чтения в вашем случае.