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是控制台?
这个问题很老了,但我会尝试回答它......
\n假设我们有以下 Phar 包的构建器脚本
(从 CLI 调用php -dphar.readonly=0 build.php
):
<?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目录结构如下所示:
\napp\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 包实际上显示了以下内容:
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()
.