Mac / MAMP上PHP文件路径的大小写不一致?

时间:2011-10-08 19:58:19

标签: php path mamp case-sensitive

我正在开发一个关于MAMP的PHP程序,并且刚刚实现了以下棘手的行为:

echo "<br/>PATH = ".dirname(__FILE__);
include 'include.php';

include.php:

<?php
echo "<br/>PATH = ".dirname(__FILE__);
?>

结果:

  

PATH = / users / me / stuff / mamp_server / my_site(全部小写)

     

PATH = / Users / me / Stuff / mamp_server / my_site(Mixed case)

导致这种不一致行为的原因是什么,我该如何防范它? (请注意,我不能只将所有内容转换为小写,因为应用程序的目的地是Linux服务器,其中文件路径区分大小写。)

更新

__FILE____DIR__存在此问题。

看起来这可能是一个真正的问题,没有解决方法......除非我另有说明,否则将提交错误报告。

错误报告:

https://bugs.php.net/bug.php?id=60017

更新:

另一个注意事项:如果您在Mac上执行绝对路径包含(...),则需要混合大小写版本。

4 个答案:

答案 0 :(得分:2)

我在MAC OS X上开发PHP时遇到了类似的问题。您可以使用区分大小写的文件系统进行格式化,但如果您使用的是Adobe的设计软件,则可能会遇到麻烦:http://forums.adobe.com/thread/392791

真正的问题是,据说不区分大小写的文件系统实际上是部分不区分大小写的。您可以在同一目录中创建名为“Filename”和“filename”的两个文件,但“Filename”和“filename”可能指向两个文件:http://systemsboy.com/2005/12/mac-osx-command-line-is-partially-case-insensitive.html

答案 1 :(得分:1)

如何在与应用程序相同的目录中创建包含文件。

<?php return __DIR__; ?>

像这样使用它:

$trueDIR = include('get_true_dir.php');

根据您在上面发布的内容,这应该可行。是的,这是一个hacky解决方法,但它是一种解决方法,甚至应该在没有遇到这个问题的系统上工作。

答案 2 :(得分:1)

这是我用来获取给定文件名的正确大小的代码:

function get_cased_filename($filename)
{
    $globbable = addcslashes($filename, '?*[]\\');
    $globbable = preg_replace_callback('/[a-zA-Z]/', 'get_bracket_upper_lower', $globbable);
    $files = glob($globbable);
    if (count($files)==1)
    {
        return $files[0];
    }
    return false;
}

function get_bracket_upper_lower($m)
{
    return '['.strtolower($m[0]).strtoupper($m[0]).']';
}

glob应该只匹配一个文件,但如果在区分大小写的文件系统上使用它可以匹配更多 - 所需的行为取决于你 - 例如,仍然返回[0]或抛出E_NOTICE什么的。

您可能会发现它很有用:$mydir = get_cased_filename(dirname(__FILE__));适用于Mac 10.6.8上的CLI PHP 5.3.6。

我用它来处理那些没有注意到“Filename”和“filename”之类的东西的同事。 (这些人也想知道为什么包含“&gt;”或“?”的文件名在从Mac复制到Windows服务器时不起作用,但我离题了......)

答案 3 :(得分:0)

我使用的是apache,我发现执行文件的__DIR__与apache配置的DOCUMENT_ROOT中找到的文件相同。

这意味着如果apache配置有

DocumentRoot /users/me/stuff/my_site

问题的脚本是打印:

PATH = /users/me/stuff/my_site (All lower case)

PATH = /Users/me/stuff/my_site (Mixed case)

如果apache配置有:

DocumentRoot /Users/me/stuff/my_site

问题的脚本是打印:

PATH = /Users/me/stuff/my_site (Mixed case)

PATH = /Users/me/stuff/my_site (Mixed case)

哪个更好。

如果遇到此问题,请检查apache配置,并考虑它是区分大小写的。