从PHP在Windows上区分大小写地包含文件
使用PHP上Windows上的PEAR库时,我们遇到了问题。
Pear包含许多类,我们使用的类很少,其中一个是在Mail.php中找到的Mail类。我们在路径上使用PEAR,而不是为单个PEAR文件提供完整的显式路径:
require_once('Mail.php');
而不是:
require_once('/path/to/pear/Mail.php');
这会导致站点的管理模块出现问题,该模块中有一个mail.php文件(用于向用户发送邮件)。如果我们处于发送电子邮件的管理屏幕中(例如,用户管理屏幕可以在经过审核队列批准后生成新的随机密码并通过电子邮件发送给用户),并且我们尝试包含Mail.php,那么"包括mail.php。
如果不更改以在PEAR安装的完整路径之前添加明确要求PEAR模块的路径(非标准的,通常将PEAR安装到路径中...),是否可以在Windows上强制PHP要求区分大小写地要求文件?
我们自己将PEAR路径添加到include路径,因此可以控制路径顺序。我们还认识到,无论大小写如何,我们都应避免使用与PEAR名称冲突的文件名,将来会这样做。但是,该页面(不是包含文件,而是一个控制器)已经存在于存储库中多年了,插件专门生成URL,以在处理过程中提供指向该页面的链接/重定向。
(We support Apache, Microsoft IIS, LightHTTPD and Zeus, using PHP 4.3 or later (including PHP5))
解决方案
回答
因为这是操作系统级别的事情,所以我认为没有简单的方法可以做到这一点。
我们可以尝试将include的内容从include('Mail.php');更改为include('./ Mail.php');,但是我不确定是否可以在Windows机器上使用(不是用PHP进行测试)。
回答
如果我们使用的是PHP 4,则可以利用此错误。当然,这是一个混乱的解决方案...
或者,我们可以将mail.php文件重命名为其他名称...
回答
在include路径中包含2个具有相同名称的文件不是一个好主意,请重命名文件,以使我们编写的文件与第三方库具有不同的名称。无论如何,针对我们当前的情况,我认为可以通过更改包含路径中路径的顺序来解决此问题。
PHP逐一搜索包含路径中的文件。当在include路径中找到所需文件时,PHP将停止搜索该文件。因此,在应用程序的管理部分中,如果要包括PEAR Mail文件而不是编写的mail.php,请更改包含路径,使PEAR路径在当前目录之前。
做这样的事情:
<?php $path_to_pear = '/usr/share/php/pear'; set_include_path( $path_to_pear . PATH_SEPARATOR . get_include_path() ); ?>
回答
我相当确定这个问题是由Win32子系统中的NTFS代码引起的。如果使用Ext2可安装文件系统(IFS),则应该在该驱动器上区分大小写。