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

Что такое 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 тоже подключается динамически только для данной отладки - а значит что для веб-режима вашего приложения он может быть по прежнему выключен. Главное, чтобы он был просто установлен на сервере. Вот как это все выглядит — на примере подключения интерпретатора с удаленного сервера на Linux:

1) Подключаем интерпретатор в настройках (Ctrl+Alt+S), и Xdebug к нему:

2) Запускаем отладку (конфигурация будет создана автоматически):

Либо можно сразу подключить интерпретатор при создании конфигурации отладки

Заодно это самый быстрый способ сделать тестовый запуск Xdebug после установки - на это нужно не более 30 секунд. И шанс на успешный запуск намного выше.

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.

Без 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();

Комментарии (9)


  1. pOmelchenko
    04.12.2023 07:58

    Xdebug это замечательно, но… всречный вопрос на ваш первый же вопрос в статье: php -a Чем не подошел?

    https://www.php.net/manual/ru/features.commandline.interactive.php


    1. a43mx Автор
      04.12.2023 07:58

      Хотя бы тем, что он не интегрирован с Phpstorm, и там нету автодополнения и прочих фич. Просто сравните php -a, которая не интегрирована, и то, как выглядит консоль, которая интегрирована. Я уж молчу про способы выполнять код вообще без консоли


      1. pOmelchenko
        04.12.2023 07:58

        А в pycharm такой же функционал как на видео?


        1. a43mx Автор
          04.12.2023 07:58

          Ну с некоторыми отличиями, но в целом да, с PyСharm она интегрирована


  1. Azmandios
    04.12.2023 07:58

    Объясните зачем это вообще нужно ?

    Проверить выражение в одну строку ? То хватает сейчас php песочниц и с разными версиями можно проверить. В шторме есть возможность создать scratch файл и его сразу выполнить


    1. a43mx Автор
      04.12.2023 07:58

      Но только ни в какие левые песочницы и в scratch вы не подключите ваш проект с его классами и т.д. Не сможете протестировать методы из этих классов. И тем более не сможете выполнять там методы, которые например делают запросы к БД. Здесь же это возможно, нет никаких препятствий для этого. А это все бывает очень полезно, когда вы изучаете чужой код в проекте, и не можете понять, что делает данный его кусок. А тут можно его выполнить прямо в редакторе, "не отходя от кассы".

      И никто не говорит что только в одну строку, в консоли можно и куски кода выполнять.

      А scratch здесь больше для другого подходит, не как скрипт, а как "игровая площадка", куда можно просто накидать черновые куски кода и выполнять их. Можно и просто выполнять скрипты по выражениям, но не строго пошагово, как в обычной отладке, а в любом удобном вам порядке.
      В общем, вариантов для чего это можно использовать, много.


      1. Azmandios
        04.12.2023 07:58

        когда не понятно что делает код, то идёшь дебагером пошагово и смотришь дамп, понимание приходит значительно быстрее.

        ещё момент, PHP в отличие от того же rust компилировать не нужно, и этот же код можно написать внутри метода

        С одной стороны я вас понимаю, допустим была реальная ситуация когда писал парсер и было удобно прямо сразу видеть что получаешь на выходе (добавляя фильтры и регулярки), с другой, не представляю где это ещё может пригодиться.


        1. a43mx Автор
          04.12.2023 07:58

          Ну пошагово, это еще нужно добраться до того места, это еще нужно отловить приложение на этом моменте. Ну где-то действительно больше подходит пошагово. Но когда в коде банально есть вызов какого-нибудь метода, который к к тому же не принимает параметры, то проще всего узнать что он возвращает - через Quick Evaluate Expression, потому что это можно сделать в один клик, без танцев с бубнами. А если таковых десятки, то это уже ощутимо, вручную на каждый из них засорять код дампами. К тому же Quick Evaluate Expression и Evaluate Expression делают графическое представление тех же массивов/объектов. Плюс окон Evaluate Expression можно открыть сколько угодно, и перед глазами будет удобный вывод результатов выполнения разных методов. Плюс можно быстро выполнить разные вариации выражений, без всяких перезапусков файла.

          Да и в пошаговой отладке эти фичи тоже можно применять, изначально они для нее и сделаны

          В общем с тех пор как я начал пользоваться всем этим, то уже и представить себе не могу процесс разработки без этого


          1. Azmandios
            04.12.2023 07:58

            вот теперь стало интересно, спасибо попробую :)