PHP中的__DIR__ Drush脚本没有返回脚本路径

时间:2017-02-28 14:42:08

标签: php drush

添加行时:

#!/usr/bin/env drush

到使用drush自动运行的PHP脚本的顶部,变量__DIR____FILE__停止返回我的脚本文件名和目录,并返回drush路径。

在使用drush脚本来获取脚本路径和目录时是否应该使用另一个变量?

注意:当我删除该行并改为使用drush scr <myscript>时,__DIR____FILE__会返回正确的路径。

[编辑]

在Hasan Bayat的答案中测试以下建议:

我运行了以下脚本:

<?php
print('__DIR__ value is: '.__DIR__."\n");
print('__FILE__ value is: '.__FILE__."\n");
print('SCRIPT_FILENAME is: '.$_SERVER['SCRIPT_FILENAME']."\n");
print('PATH_TRANSLATED is: '.$_SERVER['PATH_TRANSLATED']."\n");
print('from backtrace: '.debug_backtrace()[count(debug_backtrace()) - 1]['file']."\n");
print('included_files: '.get_included_files()[0]."\n");

使用命令行:

drush scr script.php

结果如下

__DIR__ value is: /path/to/my/script
__FILE__ value is: /path/to/my/script/script.php
SCRIPT_FILENAME is: /path/to/current/dir/index.php
PATH_TRANSLATED is: /usr/local/bin/drush
from backtrace: /usr/local/bin/drush
included_files: /usr/local/bin/drush

然后我更改了脚本,在顶部添加了行#!/usr/bin/env drush。这次用命令重新编写脚本:

./script.php

现在结果如下:

__DIR__ value is: phar:///usr/local/bin/drush/commands/core
__FILE__ value is: phar:///usr/local/bin/drush/commands/core/core.drush.inc(1194) : eval()'d code
SCRIPT_FILENAME is: /path/to/current/dir/index.php
PATH_TRANSLATED is: /usr/local/bin/drush
from backtrace: /usr/local/bin/drush
included_files: /usr/local/bin/drush

显然,没有任何建议的解决方案可以在将第一行的第一行添加到脚本中时使用。

1 个答案:

答案 0 :(得分:0)

有几种方法,但这里有两种:

  1. 使用$_SERVER全局变量:检查您的$_SERVER["SCRIPT_FILENAME"]是否存在并指向当前文件,如果不起作用,请使用$_SERVER["PATH_TRANSLATED"]它可能有效。
  2. 如果$_SERVER变量不起作用,请使用以下代码:
  3. $stack = debug_backtrace();
    $firstFrame = $stack[count($stack) - 1];
    $initialFile = $firstFrame['file'];
    

    如果它们都不起作用,请使用getcwd();获取当前工作目录,并按照您的文件名进行操作。

    编辑:第三种方法是使用get_included_files(),如果您之前没有任何包含的文件,那么您当前的文件应该是:

    $included_files = get_included_files();
    echo $included_files[0]; // Outputs current script path
    
相关问题