__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

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

0

Решение

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

  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
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]