Pull to refresh

Xdebug в качестве Php-консоли и REPL GUI —  чем заменить Python/JS консоль в Phpstorm

Reading time5 min
Views3.2K

Перешли с Python на Php, а привычной интерактивной консоли из PyCharm нет? Пользуетесь JS-консолью в инструментах разработчика браузера, а для Php такого нет? Создаете каждый раз отдельный файл для проверки выражения? Проблема решаема, ведь в качестве интерактивной оболочки можно использовать консоль Xdebug! И мало того, что она интегрирована с Phpstorm, и там работает автодополнение кода прямо из проекта, так еще там есть такие фичи, которых и вовсе нету ни в Python Console , ни в подобных REPL-интеграциях других языков программирования. С ними даже сама консоль будет практически не нужна. А настроить нужную конфигурацию для запуска можно буквально за 10-20 секунд.

Что такое REPL

Сокращение REPL расшифровывается так:

  • Read — прочитать ввод от пользователя

  • Eval — выполнить введенный код

  • Print — распечатать на экран результат

  • Loop — снова войти в режим ожидания

По сути, REPL - это консоль для выполнения команд языка программирования. Чтобы можно было быстро проверить "а как это работает", не создавая отдельный файл под каждую такую проверку. Также в REPL можно выполнять и выражения, например 2+2.

В чистом виде REPL имеет CLI-интерфейс, и может запускаться прямо в командой строке, например в том же cmd в Windows. Но гораздо удобнее работать с REPL, когда она интегрирована в интерфейс IDE.

Запуск консоли

Сама консоль доступна внутри режима отладки - то есть нужно создать php-файл, и запустить его в этом режиме, достигнув точки останова. Ну то есть по сути нужно запустить фейковую отладку. Если вы хотите, чтобы внешне запуск выглядел так, как будто вы запускаете только консоль, без отладки, то точку останова нужно обернуть в eval, например - eval('xdebug_break(); return;');. Тогда не будет автоматического открытия файла и фокусировки на точке останова.

В консоли Xdebug можно выполнять произвольный php-код, и будут доступны привычные фичи редактора Phpstorm, такие как автодополнение, подсветка и проверка синтаксиса и т.д.

Бонусные фичи

Возможности интерактивной оболочки Xdebug выходят за пределы использования консоли. Мало того, что есть фича Evaluate In Console, позволяющая в данную консоль отправить участок кода прямо из файла. Так и помимо этого тут есть такая функция, как Quick Evaluate Expression (ctrl+alt+F8 либо alt+shift+mouseClick), позволяющая выполнять выражения прямо в файле, причем в любом порядке:

Автоматическое подчёркивание доступно при использовании Alt+Shift+mouseClick, так как само оно вызывается при нажатии Alt+Shift.

Также есть и просто Evaluate Expression (Alt+F8)— выполнение выражения в одноименном окне. Это удобно, если например, нужно выполнить нужно отредактировать выражение, перед тем как его выполнить, но чтобы не вносить изменения в файл, в котором оно находится.

Для данной фичи нету предустановленного Mouse Shortcut, поэтому его нужно будет установить самому в настойках, если вы хотите пользоваться автоподчеркиванием. Я например поставил Alt+Shift+RightMouseClick.

Кстати, Quick Evaluate Expression доступна в том числе и внутри окна Evaluate Expression, и обе этих фичи доступны в консоли.

Вообще при использовании данных фич сама по себе консоль могла бы быть и вовсе не нужна. Однако выполнение нескольких выражений сразу либо языковых конструкций (if-else, echo и т.д) пока что не поддерживается ими, и работает только в консоли. Чтобы приблизить реализацию данной возможности, вы можете проголосовать за это здесь. А пока что в качестве обходного пути можно оборачивать такой код в IIFE:

(function(){
    //your php-code
})()

Создание и настройка конфигурации запуска отладки

Для того чтобы сама отладка запускалась, нужно просто создать конфигурацию и подключить интерпретатор Php, а к нему подключить расширение Xdebug. То есть не потребуется возиться c настройкой Xdebug на сервере — прописыванием директив в php.ini (xdebug.ini) и т.д. Поскольку отладка скрипта будет запускаться в CLI режиме, то их можно передавать динамически, в отличие от веб-режима (запуск в браузере). При этом все необходимые Phpstorm автоматически передаст в момент запуска, а дополнительные можно будет добавить в настройках интерпретатора. Заполнить самому нужно только поле debugger extension, которое и отвечает за подключение Xdebug - его значением заполняется директива zend_extension. То есть Xdebug тоже подключается динамически только для данной отладки - а значит что для веб-режима вашего приложения он может быть по прежнему выключен. Главное, чтобы он был просто установлен на сервере.

Вот как это все вместе выглядит - создание конфигурации отладки с созданием подключения интерпретатора, подключения к нему Xdebug, и тестовым запуском. На все уходит не больше 30 секунд:

Нужен ли SSH-туннель

SSH-туннель не потребуется, но это при условии, что на сервере не закрыты порты xdebug — 9000 либо 9003. Если же они закрыты, то отладка не запустится с сообщением "Connection was not established", и если нет возможности открыть порты, то нужно будет прокинуть SSH-туннель в терминале:

ssh -R 9000:localhost:9000 username@host-ip

А также установить в настройках интерпретатора директиву xdebug.client_host (xdebug.remote_host для xdebug < 3 версии) cо значением localhost.

UPD: на Windows было также замечено (как минимум на Windows 11, но скорее всего и на прошлых тоже), что сеанс отладки может не запуститься, если Phpstorm был установлен в учетной записи пользователя, не имеющей прав администратора. Либо если Phpstorm был установлен в С:\Program Files. Последние версии Phpstorm сами предлагают установку туда, но вообще обычно Phpstorm устанавливался в C:\Users\<UserName>\AppData\Local\Programs. Туда же он устанавливается через Jetbrain toolbox. Но если вы не хотите переустанавливать Phpstorm, либо если нет возможности расширить права вашей УЗ до администратора, то описанный вариант с SSH-туннелем должен решить проблему.

Нужно ли заполнять xdebug.client(remote)_host

Без SSH-туннеля этот параметр заполнять не нужно, так как Phpstorm через него автоматически передает ваш IP адрес. Кстати, если он у вас сменился с момента подключения интерпретатора, то отладка тоже не запустится, поскольку в конфигурации он не обновляется автоматически. Но сделать это легко - достаточно нажать Validate installation в сообщении об ошибке.


Вывод сообщений об ошибке

У Xdebug долгое время была проблема с выводом названия ошибки, и вместо этого просто выводилось “error evaluate code”, без уточнения, что именно произошло. В Xdebug 3.3 это исправлено, однако релиза стабильной версии еще не было, и он будет в конце 2023 года (UPD: уже вышел).

Обходной путь на более младших версиях

В качестве обходного пути можно  выводить стек исключений в консоль, однако кроме консоли его больше нигде и не будет — то есть например с окна Evaluate Expression нужно будет переключатся на консоль.

Чтобы включить этот обходной путь, нужно добавить в настройки интерпретатора директиву xdebug.show_exception_trace=On. На версиях xdebug старше 3 также нужно добавить xdebug.mode = develop, debug.

Если не выводится echo в консоли

По умолчанию в CLI режиме php включен неявный сброс, так что при выполнении echo сразу должен быть вывод результата в консоль, а не при завершении скрипта. Но если этого не происходит, значит, включилась буферизация вывода (например, где-нибудь в коде вашего проекта при его подключении). И ее нужно отключить командами ob_end_clean(); либо ob_end_flush();

Смотрите также: Недокументированная возможность в Phpstorm: нативная консоль php -a с автодополнением из IDE

Only registered users can participate in poll. Log in, please.
Попробовали запустить Xdebug REPL?
21.05% Пробовал, получилось4
0% Пробовал, не получилось0
36.84% Потом попробую7
42.11% Не буду пробовать/не сторонник REPL-ов8
19 users voted. Nobody abstained.
Tags:
Hubs:
Total votes 7: ↑7 and ↓0+7
Comments11

Articles