****dirname(__FILE__) 绝对路径问题二

时间:2021-03-04 12:03:07

此篇文章请在上一篇"dirname(__FILE__) 绝对路径问题一"的基础上阅读

一 问题描述

上一篇"dirname(__FILE__) 绝对路径问题一"中的代码在本地windows环境中运行正常,但是提交到linux环境中却报错,报错内容是"Notice:invalid [default store dir]   /data/web/atskernel/trunk/api/zmxy../../public/zmxytmp/",即没有找到zmxytmp目录。

二 分析问题

**经调试代码 发现问题的报错位置

****dirname(__FILE__) 绝对路径问题二

$defaultStoreDir = realpath($this->defaultStoreDir)
代码执行后,返回false,赋值给$defaultStoreDir,这样if便会执行else中的语句
trigger_error("invalid [default store dir]: " . $this->defaultStoreDir);
即文章开始提到的报错。

**将报错原因精简 进一步解决问题  代码如下:

****dirname(__FILE__) 绝对路径问题二

代码执行realpath()后,返回false,

realpath()函数,执行成功,返回其绝对路径""/data/web/atskernel/trunk/public/zmxytmp",失败时返回 FALSE,比如说文件不存在的话。详见手册http://php.net/manual/zh/function.realpath.php

**根据报错内容进一步分析问题

   报错原因:在linux环境中,"/data/web/atskernel/trunk/api/zmxy../../public/zmxytmp/",找不到文件

   其中"/data/web/atskernel/trunk/api/zmxy"指的是dirname(__FILE__)解析的当前文件路径zmxy,

"../../public/zmxytmp/"指的是在当前文件路径zmxy目录中跳转到zmxytmp目录下需要走的相对路径,既然是两个路径拼接,就需要用连接符"/"连接两者,即变为"/data/web/atskernel/trunk/api/zmxy/../../public/zmxytmp/";

    在linux环境中,执行命令 cd /data/web/atskernel/trunk/api/zmxy/../../public/zmxytmp/ 提示文件不存在,

执行 cd /data/web/atskernel/trunk/api/zmxy/跳转到zmxy目录下,然后通过cd ../   这样一步一步调试发现,我的代码中多了一个"../",然后改为 cd /data/web/atskernel/trunk/api/zmxy/../public/zmxytmp/成功找到文件,代码也运行成功,

为了兼容linux和windows的"/",将"/"替换为DIRECTORY_SEPARATOR

即将代码中的文件路径修改为dirname(__FILE__).DIRECTORY_SEPARATOR.'../public/zmxytmp/ZmopSdk.php'即可

二  总结
1 cd等同于realpath
2 使用dirname(__FILE)进行路径切换