В прошлой статье я уже рассказывал о том, что можно использовать консоль Xdebug как аналог Python Console в Phpstorm. В комментариях меня спросили, чем не подходит для этого нативная консоль php, которую можно вызвать командой php -a
(Php Interactive Shell, далее в тексте будет просто консоль Php). Я тогда ответил, что она не интегрирована с IDE, и у нее нет соответствующих фич, таких как автодополнение. Однако недавно выяснилось, что на самом деле ее можно "интегрировать" с Phpstorm одним хитрым способом. Дело в том, что ее тоже можно запустить в режиме отладки, и тогда в качестве консоли отладки будет она сама. А в консоли отладки уже доступно автодополнение из IDE.
![](https://habrastorage.org/getpro/habr/upload_files/873/b70/b30/873b70b304435fba59e3ee0d18edf164.gif)
Для запуска нужно создать конфигурацию отладки для любого php-файла, хоть даже пустого, а в interpreter options указать тот самый параметр, запускающий интерактивную консоль - -a
. Тогда в режиме отладки будет запускаться не указанный файл, для которого создана конфигурация, а именно консоль. Не указать файл не получиться, это обязательное поле. Так же, если у вас не создано подключение интерпретатора, то его нужно создать, по аналогии с тем, как это делается для Xdebug REPL, с той лишь разницей, что подключать расширение Xdebug к интерпретатору тут не обязательно.
![](https://habrastorage.org/getpro/habr/upload_files/5c1/bc1/b50/5c1bc1b5057ad7854b54b550e6c21033.png)
Забыл сказать, что в консоли должен быть отключена опция Use console input, иначе написанные вами команды не будут обрабатываться.
![](https://habrastorage.org/getpro/habr/upload_files/835/8eb/065/8358eb0650bfa61fd8b2f6f07331982e.png)
Сравнение с Xdebug REPL
Конечно, нужно учитывать, что данный способ использования Php Interactive Shell - это недокументированная возможность и даже костыль, и стабильность его работы не гарантирована (например, на некоторых прошлых версиях Phpstorm не работало автодополнение в данной консоли). Более того, если сравнивать его с тем же Xdebug REPL, то у последнего будет больше преимуществ:
В консоли Php для вывода результата нужно писать полностью echo и var_dump, тогда как в консоли Xdebug можно просто написать выражение и сразу получить результат (то есть вводите 1+1, и сразу получаете 2)
Каждый раз при запуске консоли php нужно будет заново подключать ваш проект с его библиотеками, вручную вводя соответствующие команды. В Xdebug REPL же, это можно прописать в том файле, который используется для запуска отладки, и в итоге они будут автоматически подключены при запуске.
Не запоминается история команд (при пролистывании будут доступны только те, которые были введены при включенном Use console input, то есть в консоли Xdebug)
Ну и конечно же, не будут доступны фичи 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.
![](https://habrastorage.org/getpro/habr/upload_files/3f6/b4c/a0e/3f6b4ca0e1f94d63756b718abdb2fc4f.gif)
Напоминаю, что при переходе в консоль Xdebug нужно снова включить опцию Use console input - данная консоль, в отличие от Php консоли, обрабатывает команды тогда, когда эта опция включена.
P.S. Стабильность возможности запуска Xdebug из Php Interactive Shell точно так же не гарантирована, и может снова перестать работать в следующих версиях Php либо Xdebug - разработчик Xdebug пока не заявлял официально о том, что проблема решена. Скорее всего, это запуск стал возможен благодаря изменениям на стороне Php, тем более что разработчик Xdebug заявлял, что именно из-за проблем на стороне php и не получалось раньше запускать Xdebug из консоли php.