Linux:文件既存在又不存在


Linux: File both exists and not exists

我正在编写一个PHP应用程序,我刚刚遇到了一个非常奇怪的错误。在最近迁移到一个新的(Ubuntu)服务器之后,我开始在require_once语句上出现致命错误。显然文件不存在,或者文件权限错误,对吧?

不,结果是:

文件存在
该文件从SVN存储库签出。当我进入文件夹并列出文件(lsls -l)时,文件清楚地存在并且具有正确的文件大小。当我更新存储库中的文件并更新工作副本时,更改将被复制到工作副本。该文件具有权限,因此每个人都应该能够看到和读取它。同一目录下的其他文件运行正常。

文件也不存在:
PHP退出时出现致命错误,因为找不到文件。如果我使用find-命令,则找不到该文件。如果我尝试使用nano来编辑该文件,它会声明该文件不存在。如果我开始输入文件名并按tab键自动完成,它找不到文件。

此行为现在发生在两个独立的服务器上,但在第三个服务器上运行良好。所有的服务器都运行Ubuntu 10.04。

有人知道发生了什么事吗?

编辑:
文件名为adminpv4rangeaddformhandler .inc.


完整错误信息,文件路径被遮蔽:
Warning: require_once(fullpath/AdminIpv4RangeAddFormHandler.inc): failed to open
stream: No such file or directory in fullpath/anotherfile.inc on line 34 Fatal error: 
require_once(): Failed opening required 'fullpath/AdminIpv4RangeAddFormHandler.inc' 
(include_path='.:/usr/share/php:/usr/share/pear') in fullpath/anotherfile.inc on line 
34 

下面的命令没有输出:

find -name AdminIpv4RangeAddFormHandler.inc -ls

常规的ls -li输出(除其他外)如下行:

2233407 -rwxr-xr-x 1 root root 1597 2011-12-13 08:02 AdminIPv4RangeAddFormHandler.inc

切换操作系统时要小心,因为有些操作系统是区分大小写的,而有些则不是。

我使用我的Mac进行开发(不区分大小写),所以我使用file_exists()或include_once()等的大小写并不重要。然后我部署到Ubuntu 11(区分大小写),我所有的include都停止工作了。我怀疑你也有同样的问题。

对我来说,棘手的部分是,当使用git时,我的版本控制没有检测到文件名大小写的变化作为修改。实际上,我必须用某种前缀重新命名每个文件,提交和部署,将它们重新命名为它们应该是什么(使用一致的大写字母!),最后再次提交和部署。这是一种彻底的痛苦。

故事的寓意——为你的生产系统编写代码,而不是为你的开发系统编写代码

好好看看你的文件名:

AdminIpv4RangeAddFormHandler  # from PHP
AdminIpv4RangeAddFormHandler  # from find command
AdminIPv4RangeAddFormHandler  # from ls output
      ^

您应该选择IPIp,并坚持的决定