从控制台调用时,如何在Phar存档的PHP脚本中getcwd()
?
考虑这个电话:
/path/to/my/actual/cwd> php index.php
在这种情况下,getcwd()
将返回/path/to/my/actual/cwd
。现在我们采用相同的脚本,将它放在Phar中并像这样调用它:
/path/to/my/actual/cwd> php /path/to/my/phar/archive.phar
这一次,getcwd()
将返回/path/to/my/phar
,因为这是Phar存档的当前工作目录,但我没有从该目录调用存档,控制台的cwd是不同的
我怎么能得到它?
或者甚至更好,我如何强制Phar中的所有脚本认为他们的cwd是控制台?
答案 0 :(得分:2)
这个问题很老了,但我会尽量回答它...
假设我们有以下 Phar 包的构建器脚本
(从 CLI 使用 php -dphar.readonly=0 build.php
调用):
<?php
$phar = new Phar('bundle.phar');
$phar->startBuffering();
$phar->addFile('index.php');
$phar->setStub('<?php var_dump(["cwd" => getcwd(), "dir" => __DIR__]);
__HALT_COMPILER();');
$phar->stopBuffering();
目录结构如下:
app
├── other
└── phar
├── build.php
└── bundle.phar
在目录 /app/other
中并调用 Phar 包实际上显示了 PHP 7.4 的以下内容:
cd /app/other
php /app/phar/bundle.phar
array(2) {
["cwd"]=>
string(31) "/app/other"
["dir"]=>
string(30) "/app/phar"
}
因此,Phar 存根 是处理(或保留)上下文(如 getcwd()
)的地方。
答案 1 :(得分:0)
未经测试,但我不再使用 getcwd(),因为我在cronjobs中遇到了一些麻烦。在这种情况下,这是我的解决方案:
echo __DIR__;