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

Posted

技术标签:

【中文标题】Mac / MAMP上PHP文件路径的大小写不一致?【英文标题】:Case-inconsistency of PHP file paths on Mac / MAMP? 【发布时间】:2011-12-03 16:56:49 【问题描述】:

我正在 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(混合大小写)

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

更新:

__FILE____DIR__ 存在此问题。

看起来这可能是一个没有解决办法的真正问题...除非我听到其他情况,否则将提交错误报告。

错误报告:

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

更新:

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

【问题讨论】:

唯一想到的想法是在每条路径上运行 realpath() 并查看这是否会改变任何东西......否则,我认为这真的是一个错误报告的东西 Pekka- 是的,已经尝试了 realpath() 的东西- 不行 我无法重现此错误。你用的是什么版本的 PHP 和 Apache? @afuzz- Apache/2.2.17 PHP/5.3.6 (MAMP 2.0) 您可以将 HFS+ 文件系统配置为区分大小写,也许这会给您正确的文件名? 【参考方案1】:

如何在与您的应用相同的目录中创建一个包含文件。

<?php return __DIR__; ?>

像这样使用它:

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

根据您上面发布的内容,这应该可以。是的,这是一个有点老套的解决方法,但它是一种解决方法,即使在没有遇到此问题的系统上也应该可以工作。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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。

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

【讨论】:

【参考方案4】:

我使用的是 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 配置,注意区分大小写。

【讨论】:

以上是关于Mac / MAMP上PHP文件路径的大小写不一致?的主要内容,如果未能解决你的问题,请参考以下文章

MAC OS X:MAMP 环境和虚拟主机

使用 MAMP 和 MAC 在 php myadmin 上获取错误 500

在 Mac 上为 MAMP 安装新的 PHP 版本 [关闭]

Mac mamp mysqli连不上数据库

在mac php7.2 MAMP上安装mcrypt

使用 MAMP 在 mac os 上 phpize 问题