Недокументированная возможность в Phpstorm: нативная консоль php -a с автодополнением из IDE
В прошлой статье я уже рассказывал о том, что можно использовать консоль Xdebug как аналог Python Console в Phpstorm. В комментариях меня спросили, чем не подходит для этого нативная консоль php, которую можно вызвать командой php -a
(Php Interactive Shell, далее в тексте будет просто консоль Php). Я тогда ответил, что она не интегрирована с IDE, и у нее нет соответствующих фич, таких как автодополнение. Однако недавно выяснилось, что на самом деле ее можно «интегрировать» с Phpstorm одним хитрым способом. Дело в том, что ее тоже можно запустить в режиме отладки, и тогда в качестве консоли отладки будет она сама. А в консоли отладки уже доступно автодополнение из IDE.
Для запуска нужно создать конфигурацию отладки для любого php-файла, хоть даже пустого, а в interpreter options указать тот самый параметр, запускающий интерактивную консоль — -a
. Тогда в режиме отладки будет запускаться не указанный файл, для которого создана конфигурация, а именно консоль. Не указать файл не получиться, это обязательное поле. Так же, если у вас не создано подключение интерпретатора, то его нужно создать, по аналогии с тем, как это делается для Xdebug REPL, с той лишь разницей, что подключать расширение Xdebug к интерпретатору тут не обязательно.
Забыл сказать, что в консоли должен быть отключена опция Use console input, иначе написанные вами команды не будут обрабатываться.
Сравнение с Xdebug REPL
Конечно, нужно учитывать, что данный способ использования Php Interactive Shell — это недокументированная возможность и даже костыль, и стабильность его работы не гарантирована (например, на некоторых прошлых версиях Phpstorm не работало автодополнение в данной консоли). Более того, если сравнивать его с тем же Xdebug REPL, то у последнего будет больше преимуществ:
1) В консоли Php для вывода результата нужно писать полностью echo и var_dump, тогда как в консоли Xdebug можно просто написать выражение и сразу получить результат (то есть вводите 1+1, и сразу получаете 2)
2) Каждый раз при запуске консоли php нужно будет заново подключать ваш проект с его библиотеками, вручную вводя соответствующие команды. В Xdebug REPL же, это можно прописать в том файле, который используется для запуска отладки, и в итоге они будут автоматически подключены при запуске.
3) Не запоминается история команд (при пролистывании будут доступны только те, которые были введены при включенном Use console input, то есть в консоли Xdebug)
4) Ну и конечно же, не будут доступны фичи Quick Evaluate Expression и Evaluate expression.
И еще одна возможность
Пока писал статью, обнаружил, что таки возможно запускать отладку Xdebug из Php Interactive Shell, хотя считалось, что это не работает (чтобы получилось, php должен быть не младше 8 версии). А это означает, что консолью отладки уже будет консоль Xdebug, то есть вышеописанные преимущества станут доступны (кроме пункта 2, поскольку запуск отладки идет не из файла). Чтобы отладка могла запуститься, к интерпретатору должно быть подключено расширение Xdebug. А в консоли нужно ввести xdebug_break();
. Так же замечен баг, что отладка начинается, если ввести команду управления буфером, например, ob_start();
, ob_flush();
и т.д. В Xdebug 3.3 любая команда, введенная первой, запускает отладку Xdebug. Обратите внимание так же, что пока что запустить отладку можно только один раз за одну сессию Php Interactive Shell.
Напоминаю, что при переходе в консоль Xdebug нужно снова включить опцию Use console input — данная консоль, в отличие от Php консоли, обрабатывает команды тогда, когда эта опция включена.
P.S. Стабильность возможности запуска Xdebug из Php Interactive Shell точно так же не гарантирована, и может снова перестать работать в следующих версиях Php либо Xdebug — разработчик Xdebug пока не заявлял официально о том, что проблема решена. Скорее всего, это запуск стал возможен благодаря изменениям на стороне Php, тем более что разработчик Xdebug заявлял, что именно из-за проблем на стороне php и не получалось раньше запускать Xdebug из консоли php.