PHP Conference Japan 2024

getcwd

(PHP 4, PHP 5, PHP 7, PHP 8)

getcwd获取当前工作目录

描述

getcwd(): 字符串|false

获取当前工作目录。

参数

此函数没有参数。

返回值

成功时返回当前工作目录,失败时返回false

在某些 Unix 变体中,如果任何一个父目录没有设置可读或搜索模式,即使当前目录有,getcwd() 也会返回false。有关模式和权限的更多信息,请参见chmod()

示例

示例 #1 getcwd() 示例

<?php

// 当前目录
echo getcwd() . "\n";

chdir('cvs');

// 当前目录
echo getcwd() . "\n";

?>

以上示例将输出类似以下内容

/home/didou
/home/didou/cvs

注释

注意

如果 PHP 解释器已启用 ZTS(Zend 线程安全)构建,则getcwd() 返回的当前工作目录可能与操作系统接口返回的当前工作目录不同。依赖于当前工作目录的外部库(通过FFI 调用)将受到影响。

参见

添加注释

用户贡献的注释 18 条注释

45
dave at corecomm dot us
20 年前
getcwd() 返回 URL 中引用的“主”脚本的路径。

dirname(__FILE__) 将返回当前正在执行的脚本的路径。

我编写了一个脚本,需要来自同一目录的几个类定义脚本。它根据文件名匹配检索它们,并使用 getcwd 来确定它们的位置。

当需要从不同目录中的新文件调用第一个脚本时,效果不太好。
10
hodgman at ali dot com dot au
18 年前
我使用此代码在 PHP 中复制 pushd 和 popd DOS 命令

<?php
$g_DirStack
= array();
function
pushd( $dir )
{
global
$g_DirStack;
array_push( $g_DirStack, getcwd() );
chdir( $dir );
}
function
popd( )
{
global
$g_DirStack;
$dir = array_pop( $g_DirStack );
assert( $dir !== null );
chdir( $dir );
}
?>

这允许您使用 pushd 更改当前目录,然后在完成后使用 popd “撤消”目录更改。
11
znupi69NOSPAMHERE at gmail dot com
16 年前
在命令行上运行 PHP 时,如果要包含另一个与主脚本位于同一目录的文件,只需执行以下操作
<?php
include './otherfile.php';
?>
可能不起作用,如果您像这样运行脚本
/$ /path/to/script.php
因为当前工作目录将设置为“/”,并且文件“/otherfile.php”不存在,因为它位于“/path/to/otherfile.php”中。
因此,要获取脚本所在的目录,可以使用此函数
<?php
function get_file_dir() {
global
$argv;
$dir = dirname(getcwd() . '/' . $argv[0]);
$curDir = getcwd();
chdir($dir);
$dir = getcwd();
chdir($curDir);
return
$dir;
}
?>
因此您可以像这样使用它
<?php
include get_file_dir() . '/otherfile.php';
// 或者甚至..
chdir(get_file_dir());
include
'./otherfile.php';
?>
花了一些时间思考这个问题,也许它对某些人有帮助 :)
2
CXJ
7 年前
getcwd() 似乎在路径上调用了等效于 PHP 的 realpath() 的函数。它永远不会返回符号链接,而始终返回到当前工作目录的路径中的实际目录名称。
5
marcus at synchromedia dot co dot uk
19 年前
在某些 Unix 变体上,如果任何一个父目录没有设置可读或搜索模式,即使当前目录有,getcwd() 也会返回 FALSE。

仅供参考,MacOS X 就是这些变体之一(至少 10.4 对我来说是这样)。您可以通过对从您的站点文件夹向上所有文件夹应用“chmod a+rx”来使其工作。
3
匿名
2 年前
给定一个链接
/some/link->/some/location/path

使用 Linux bash,
如果在链接的抽屉 /some/link 内
cd .. 上移到链接 /some/
cd -P .. 上移到目标 /some/location/

使用 php
fopen ("../file") 上移到目标 /some/location/file

其他人评论了获取下方路径的方法。

我发现使用 $_SERVER['DOCUMENT_ROOT'] 代替
重新构建绝对路径比较幸运。
10
ash at ashmckenzie dot org
16 年前
在使用 CLI 工具时,PHP5 中似乎与 PHP4 相比,功能发生了变化。以下是一个示例:-

cd /tmp

cat > foo.php << END
<?php
print getcwd() . "\n";
?>
END

cd /

php -q /tmp/foo.php

PHP4 返回 /tmp
PHP5 返回 /

需要注意这一点。
6
mark dot phpnetspam at mhudson dot net
18 年前
此函数通常与 basename() 结合使用,例如:
https://php.net/manual/en/function.basename.php
6
troy dot cregger at gmail dot com
17 年前
如果您在需要包含(使用 include、require 或 *_once)到脚本中(位于同一目录树之外)的文件中使用 getcwd(),请注意。

示例
<?php
// 在 /var/www/main_document_root/include/MySQL.inc.php 中
if (strpos(getcwd(),'main_')>0) {
// 设置主数据库连接的代码
}
?>

<?php
// 在 home/cron_user/maintenance_scripts/some_maintenance_script.php 中
require_once ('/var/www/main_document_root/include/MySQL.inc.php');
?>

在上面的示例中,数据库连接将不会建立,因为对 getcwd() 的调用返回相对于调用脚本的路径(/home/cron_user/maintenance_scripts),而不是相对于调用 getcwd() 函数的文件的路径。
6
memandeemail at gmail dot com
18 年前
某些服务器具有阻止 getcwd() 的安全选项。

备选方案

str_replace($_SERVER['SCRIPT_NAME'],'', $_SERVER['SCRIPT_FILENAME']);
4
Craig
8 年前
在包含符号链接的目录中调用 getcwd() 时要注意。

getcwd() 等同于 shell 命令“pwd -P”,它会解析符号链接。

shell 命令“pwd”等同于“pwd -L”,它使用环境中的 PWD 而不解析符号链接。这也等同于调用 getenv('PWD')。
6
leonbrussels at gmail dot com
16 年前
这是一个将路径(看起来像这样)转换的函数

/home/www/somefolder/../someotherfolder/../

转换为正确的目录路径

<?php

function simplify_path($path) {

// 将当前工作目录保存到变量中
$oldcwd = getcwd();
// 将目录更改为要转换的目录
//$path 是要转换(清理)的目录,作为字符串传递给 // 函数

chdir($path);
return
gstr_replace('\\', '/', getcwd());

// 将 cwd 更改回旧值,以免干扰脚本
chdir($oldcwd);

}

函数 非常有用,如果您想比较两个不一定处于 "清理" 状态的文件路径。它在 *NIX WINDOWS 中均适用

?>
7
匿名
14 年前
正如您在
https://php.net/manual/en/features.commandline.differences.php
中所读到的,CLI SAPI 与其他 SAPI 不同,不会自动将当前工作目录更改为启动脚本所在的目录。

一个非常简单的解决方法,可以恢复您在“普通”网页脚本中习惯的行为,就是在脚本的开头包含类似以下内容

<?php
chdir
( dirname ( __FILE__ ) );
?>

但是,由于这与读取或“查找”路径有关,因此如果您分享一些我在 CLI 脚本中经常使用的一些更复杂的技巧,您可能会对此表示赞赏……

<?php
// 注意:后续变量中存储的所有路径最终都以 DIRECTORY_SEPARATOR 结尾

// 如何存储脚本被调用的“从哪里”的工作目录:
$initial_cwd = preg_replace( '~(\w)$~' , '$1' . DIRECTORY_SEPARATOR , realpath( getcwd() ) );

// 如何无符号链接地切换到当前文件所在的文件夹:
chdir( dirname ( realpath ( __FILE__ ) ) );

// 如何将前一个文件夹存储在变量中:
$my_folder = dirname( realpath( __FILE__ ) ) . DIRECTORY_SEPARATOR;

// 如何获取上一级文件夹的路径,如果 $my_folder 以 \class\ 或 /class/ 结尾:
$my_parent_folder = preg_replace( '~[/\\\\]class[/\\\\]$~' , DIRECTORY_SEPARATOR , $my_folder );

// 如何在任何情况下获取上一级文件夹的路径:
$my_parent_folder = preg_replace( '~[/\\\\][^/\\\\]*[/\\\\]$~' , DIRECTORY_SEPARATOR , $my_folder );

// 如何从 unix 风格路径数组中创建 OS 风格路径数组
// (如果您使用配置文件等,则很方便):
foreach( $unix_style_pathes as $unix_style_path )
$os_independent_path[] = str_replace( '/' , DIRECTORY_SEPARATOR , $unix_style_path );

?>
7
bvidinli at gmail dot com
15 年前
如果您将 php 链接到 /bin/linkedphp,并且您的 php 位于例如 /home/actual.php

当您在文件系统中的某个位置运行 linkedphp 时,
getcwd 返回 /bin 而不是工作目录,

解决方法:使用 dirname(__FILENAME__) 代替
4
znupi69NOSPAMHERE at gmail dot com
16 年前
针对我自己的回复:该函数不适用于以下情况
/usr/bin$: /home/johndoe/Work/script.php
所以这里有一个更好更简单的方法(我认为这个适用于所有情况)
<?php
function get_file_dir() {
global
$argv;
return
realpath($argv[0]);
}
?>
尽情使用吧 :)
3
manux at manux dot org
20 年前
注意
工作目录,因此
getcwd ()
在注册的关闭函数中为“/”!!!
2
ab5602 at wayne dot edu
17 年前
如果在使用 NFS 挂载的子目录的 Solaris 下,getcwd() 对您返回空值,则您遇到了一个操作系统错误,该错误据称已在最近版本的 Solaris 10 中修复。此相同的操作系统错误也会影响 include() 和 require() 函数。
1
vermicin at antispam dot gmail dot com
19 年前
如果您的 PHP cli 二进制文件构建为 cgi 二进制文件(使用 php_sapi_name 检查),则 cwd 的功能与您预期不同。

假设您有一个脚本 /usr/local/bin/purge
您在 /home/username 中

php CLI:getcwd() 会为您提供 /home/username
php CGI:getcwd() 会为您提供 /usr/local/bin

如果您正在使用 php 编写命令行脚本,这可能会给您带来麻烦。您可以通过向 php 调用中添加 -C 来覆盖 CGI 行为

#!/usr/local/bin/php -Cq

然后 getcwd() 的行为就像在 CLI 编译版本中一样。
To Top