__DIR__ в сценарии PHP Drush не возвращает путь к сценарию

При добавлении строки:

#!/usr/bin/env drush

в начало PHP-скрипта для автоматического запуска с использованием drush переменные __DIR__ и __FILE__ перестают возвращать имя файла и каталог моего скрипта и вместо этого возвращают пути drush.

Есть ли другая переменная, которую следует использовать в случае drush-скриптов, чтобы получить путь к скрипту и каталог?

Примечание. Когда я удаляю эту строку и вместо нее использую drush scr <myscript>, __DIR__ и __FILE__ возвращают правильные пути.

[РЕДАКТИРОВАТЬ]

Чтобы проверить приведенные ниже предложения в ответе Хасана Баята:

Я запустил следующий скрипт:

<?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

Таким образом, очевидно, что ни одно из предложенных решений не работает, если в сценарий добавлена ​​первая строка drush.


person Bishoy    schedule 28.02.2017    source источник


Ответы (1)


Есть несколько способов, но вот два:

  1. Используя глобальную переменную $_SERVER: убедитесь, что $_SERVER["SCRIPT_FILENAME"] существует и указывает на текущий файл, затем, если он не работает, используйте $_SERVER["PATH_TRANSLATED"], он может работать.
  2. Если переменная $_SERVER не работает, используйте следующий код:
$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
person Empire    schedule 28.02.2017