少用但始终都会碰到 - 当前工作目录

  • 作者:KK

  • 发表日期:2016.12.13


要点速读

  1. getcwd获取当前工作目录

  2. 在任何地方执行include|require传入相对路径,都会优先从工作目录开始找文件

  3. 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一般很少用,一旦项目里有这种代码但愿不是手贱多打的,注意审核一下原因,有没有其它办法取代解决