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 时遇到过类似的问题。您可以使用区分大小写的文件系统进行格式化,但如果您使用的是 Adobe 的设计软件,您可能会遇到麻烦: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文件路径的大小写不一致?的主要内容,如果未能解决你的问题,请参考以下文章
使用 MAMP 和 MAC 在 php myadmin 上获取错误 500