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

时间:2016-02-18 16:26:33

标签: php console filesystems command-line-interface phar

从控制台调用时,如何在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是控制台?

2 个答案:

答案 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__;