我正在编写一个PHP应用程序,我刚刚遇到了一个非常奇怪的错误。在最近迁移到一个新的(Ubuntu)服务器之后,我开始在require_once语句上出现致命错误。显然文件不存在,或者文件权限错误,对吧?
不,结果是:
文件存在
该文件从SVN存储库签出。当我进入文件夹并列出文件(ls或ls -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
^
您应该选择IP
或Ip
,并坚持的决定。