如何获取Phar中的当前工作目录?

Ton*_*nov 6 php filesystems console command-line-interface phar

getcwd()从控制台调用时,如何在Phar存档中的PHP脚本中?

考虑这个电话:

/path/to/my/actual/cwd> php index.php
Run Code Online (Sandbox Code Playgroud)

在这种情况下,getcwd()将返回/path/to/my/actual/cwd.现在我们采用相同的脚本,将它放在Phar中并像这样调用它:

/path/to/my/actual/cwd> php /path/to/my/phar/archive.phar
Run Code Online (Sandbox Code Playgroud)

这次,getcwd()将返回,/path/to/my/phar因为那是Phar存档的当前工作目录,但我没有从该目录调用存档,控制台的cwd不同.

我怎么能得到它?

或者甚至更好,我如何强制Phar中的所有脚本认为他们的cwd是控制台?

Oli*_*der 3

这个问题很老了,但我会尝试回答它......

\n

假设我们有以下 Phar 包的构建器脚本
(从 CLI 调用php -dphar.readonly=0 build.php):

\n
<?php\n$phar = new Phar('bundle.phar');\n$phar->startBuffering();\n$phar->addFile('index.php');\n$phar->setStub('<?php var_dump(["cwd" => getcwd(), "dir" => __DIR__]);\n__HALT_COMPILER();');\n$phar->stopBuffering();\n
Run Code Online (Sandbox Code Playgroud)\n

目录结构如下所示:

\n
app\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 other\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 phar\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build.php\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bundle.phar\n
Run Code Online (Sandbox Code Playgroud)\n

在 PHP 7.4 中,在目录中/app/other并调用 Phar 包实际上显示了以下内容:

\n
cd /app/other\nphp /app/phar/bundle.phar\n\narray(2) {\n  ["cwd"]=>\n  string(31) "/app/other"\n  ["dir"]=>\n  string(30) "/app/phar"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

因此,Phar存根是处理(或保存)上下文(如getcwd().

\n