При добавлении строки:
#!/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
Таким образом, очевидно, что ни одно из предложенных решений не работает, если в сценарий добавлена первая строка для заливки.
Есть несколько способов, но вот два:
$_SERVER
Глобальная переменная: проверьте ваш $_SERVER["SCRIPT_FILENAME"]
существует и указывает на текущий файл, тогда, если он не работает, используйте $_SERVER["PATH_TRANSLATED"]
это может работать.$_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
Других решений пока нет …