少用但始终都会碰到 - 当前工作目录 ¶
作者:KK
发表日期:2016.12.13
要点速读 ¶
getcwd
获取当前工作目录在任何地方执行
include|require
传入相对路径,都会优先从工作目录开始找文件chdir
修改当前工作目录,但一般很少用,一旦项目里有这种代码,注意审核一下原因,有没有其它办法取代解决
正文 ¶
假设有如下目录结构和相关代码:
a.php include('b/c.php')
d.php echo 123
b
c.php include('d.php')
如果运行a.php,会正常输出123
重点是要关注的是b/c.php
里面的include('d.php')
,这个不是从c.php相同的目录(b目录)开始找d.php
而是从当前工作目录开始找,当前工作目录就是刚开始运行的第一个PHP脚本所在目录,就是a.php所在的目录
getcwd()函数返回当前工作目录
重要知识点:一切include|require传入相对路径的话,无论在哪个文件里面执行都是从getcwd()这个目录开始找文件的
cwd,应该是current working path的缩写吧
修改当前工作目录 ¶
一般来说如果我们不手动写代码干预的话,PHP在系统层面是不会擅自修改我们的工作目录的
通常都是我们自己手动修改,办法是使用chdir
函数,比如:chdir(__DIR__ . '/..')
就把当前工作目录修改为当前脚本的上一级目录了
相关经历 ¶
曾有一次调试程序时,记得无论在哪执行include都应该是从网站根目录开始找文件的才对
可是我因为开发某功能而在某个地方添加了include代码后却说找不到文件,我从网站根目录开始摸来摸去怎么都觉得路径是对的
后来我回想起有当前工作目录这回事,于是我估计是被chdir
这样的函数修改了当前工作目录
所以我在项目源代码里搜索chdir
这个关键字,果然搜到了两个调用的地方
A调用点我一看就知道跟我的运行流程无关,于是再看了B调用点,发现它确实是在我添加的include代码之前有执行,所以断定就是它造成的影响
但既然人家要执行chdir修改当前工作目录的话,它自然是有它底层的原因
我唯一能做的就是根据它改变的当前工作目录重新写include的路径,but我并不是重新写一个正确的相对路径,而是直接写绝对路径,比如APP_PATH . '/b/c.php'
这样,只要不基于工作目录去include文件,我就不怕有其它脚本修改工作目录了
希望大家接触这类场景时也尽量不要写相对路径吧
chdir
一般很少用,一旦项目里有这种代码但愿不是手贱多打的,注意审核一下原因,有没有其它办法取代解决