在 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 安装到您的路径...)是否有一种方法可以强制 Windows 上的 PHP 要求文件区分大小写?
我们自己将 PEAR 路径添加到包含路径中,因此可以控制路径顺序。我们还认识到,无论大小写,我们都应该避免使用与 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('Mail.php');
到 include('./Mail.php');
, ,但我不确定这是否适用于 Windows 机器(没有 PHP 来测试)。
如果您使用 PHP 4,您可以利用 这 漏洞。当然,这是一个混乱的解决方案......
或者您可以将 mail.php 文件重命名为其他名称...
我相当确定这个问题是由 Win32 子系统中的 NTFS 代码引起的。如果您使用 Ext2 可安装文件系统 (IFS),则该驱动器上应该区分大小写。