Перешли с 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 секунд:

UPD: если вы подключаетесь к удаленному серверу, а ваш компьютер выходит в сеть через роутер, то отладка может не запуститься, поскольку в xdebug.client_host, заполняемый автоматически, подставляется не IP вашего устройства (который не имеет внешнего IP), а IP роутера. Проблема решается пробросом SSH туннеля:

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

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

Но если вы смогли запустить отладку без SSH-туннеля, то тогда xdebug.client_host заполнять не нужно.

Также SSH-туннель нужно пробрасывать, если на сервере закрыты порты xdebug - 9000 или 9003.


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

У 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();

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Попробовали запустить Xdebug REPL?
21.05%Пробовал, получилось4
0%Пробовал, не получилось0
36.84%Потом попробую7
42.11%Не буду пробовать/не сторонник REPL-ов8
Проголосовали 19 пользователей. Воздержавшихся нет.