Включение файлов с учетом регистра в Windows из PHP
Вопрос
У нас возникла проблема с использованием PEAR
библиотеки на Windows
От PHP
.
Pear содержит много классов, мы используем довольно много, одним из которых является класс Mail, найденный в Mail.php
.Мы используем PEAR для указания пути, вместо того чтобы указывать полный явный путь к отдельным файлам PEAR:
require_once('Mail.php');
Вместо того , чтобы:
require_once('/path/to/pear/Mail.php');
Это вызывает проблемы в модуле администрирования сайта, где есть mail.php
файл (используется для отправки писем пользователям).Если мы находимся на административном экране, который отправляет электронное письмо (например, на экране администрирования пользователей, который может генерировать и отправлять по электронной почте новые случайные пароли пользователям, когда они будут одобрены в очереди на модерацию), и мы пытаемся включить Mail.php
мы "случайно" включаем mail.php .
Без изменения, чтобы добавить полный путь к установке PEAR, явно требующей модулей PEAR (нестандартных, обычно вы устанавливаете PEAR на свой path ...), есть ли способ заставить PHP в Windows требовать, чтобы файлы учитывали регистр?
Мы сами добавляем путь PEAR к пути include, поэтому контролируем порядок следования путей.Мы также признаем, что нам следует избегать использования имен файлов, которые конфликтуют с именами PEAR, независимо от регистра, и в будущем будем делать это.Однако эта страница (которая является не включаемым файлом, а контроллером) находится в репозитории уже несколько лет, и плагины специально генерируют URL-адреса для предоставления ссылок / перенаправлений на эту страницу при их обработке.
(Мы поддерживаем Apache, Microsoft IIS, LightHTTPD и Zeus, используя PHP 4.3 или более позднюю версию (включая PHP5))
Решение
наличие 2 файлов с одинаковыми именами в пути включения не является хорошей идеей, переименуйте ваши файлы так, чтобы файлы, которые вы написали, имели разные имена из сторонних библиотек.в любом случае, для вашей текущей ситуации, я думаю, изменив порядок путей в вашем включаемом пути, вы можете это исправить.PHP выполняет поиск файлов по включаемым путям, один за другим.когда требуемый файл будет найден по включаемому пути, PHP прекратит поиск файла.итак, в разделе администрирования вашего приложения, если вы хотите включить почтовый файл PEAR вместо написанного вами mail.php, измените путь включения, чтобы путь PEAR был перед текущим каталогом.сделайте что-то вроде этого:
<?php
$path_to_pear = '/usr/share/php/pear';
set_include_path( $path_to_pear . PATH_SEPARATOR . get_include_path() );
?>
Другие советы
Поскольку это зависит от уровня операционной системы, я не верю, что есть простой способ сделать это.
Вы могли бы попробовать изменить свой include на include('Mail.php');
Для include('./Mail.php');
, но я не уверен, будет ли это работать в окне Windows (у меня нет окна с PHP для тестирования).
Если вы используете PHP 4, вы можете воспользоваться преимуществами это жук.Конечно, это грязное решение...
Или вы могли бы просто переименовать свой файл mail.php во что-нибудь другое...
Я совершенно уверен, что эта проблема вызвана кодом NTFS в подсистеме Win32.Если вы используете файловую систему с возможностью установки Ext2 (IFS), вы должны учитывать регистр символов на этом диске.