AlexeyGfi
@AlexeyGfi
YouTube >>> Битриксоид из Колхоза

Eclipse PDT / PHPStorm — как настроить полноценные подсказки?

Помогите разобраться.

Один из клиентов обновился и вместо стабильных обновлений закачал себе ещё и beta. На сайте все стандартные компоненты заменились на чистый D7(новое ядро)-код.
Это было замечено не сразу, заказы на сайте идут активно, потому вариант откатится на бекап не подошёл.

Я пишу на Notepad++, по памяти (подсказки только отвлекают) он меня устраивает. Но тут возникла ситуация, когда нужно срочно разобраться с новым ядром, а документация по нему готова процентов на пятнадцать (ИМХО), хотя уже лет пять как оно родилось. Потому понадобился мощный инструмент с «древовидным сканером» по классам и подсказками.

Скачал полностью D7-ядро, поставил Eclipse PDT и скормил ему. Он всё хорошо подсказывает, но возникла следующая ситуация.

Если рассмотреть такой код, в списке предлагаемых методов, начинающихся на «get» выдаёт такой список:

5f06d96260a94da38720c9a24a2bc785.png

Если же прописать phpdoc-вставку (заметил что доступны расширенные функции по примерам из Интернета и блин пришлось раскопать код в компонентах, иначе фиг бы догадался), начинает выдавать расширенный список:

4cc0969806a5458c945b5f0ac3263b7f.png

Аналогично в PHPStorm-е. К слову, шторм показал себя в этой ситуации хуже: он к переменной $bi вообще вариантов не выдаёт (и когда набираешь неймспейс, например «\Bitrix\Iblock\» — подсказок нет, в то время как эклипс выдаёт подклассы):

6ec305595a9243e1ae29341343ab821f.png

Прописываем вставку и шторм подхватывает:

caa365a7a05c40e1a8392ada6044f321.png

Собственно вопрос и несколько сопутствующих вопрошаний:
Подскажите, пожалуйста, как мне в процессе набора кода понимать: подсказки содержат полный набор или что-то ещё можно подключить и для этого нужна phpdoc-вставка (и понимать, какая именно) аналогичная той, что в примере?
• Ситуация со штормом штатная, или я что-то не настроил и он «может лучше»?
• Кто в Notepad++: есть какой-то плагин, позволяющий вот так же скормить для индексации ядро?

P.S.: в процессе разбора ситуации был испробован и Visual Studio Code, но там ещё большая печаль.
  • Вопрос задан
  • 884 просмотра
Решения вопроса 1
AlexeyGfi
@AlexeyGfi Автор вопроса
YouTube >>> Битриксоид из Колхоза
Сам спросил, сам отвечаю =)
Мучил техподдержку, но разговор похож на теннис — перебрасывание мячика с поля на поле.

Настроил отладку через xdebug и в вотчере всё увидел.
Вот как это выглядит в дебагере:
145d7304f9b846eabb6eb93c43ef0924.png

================ Удалённый дебаггинг (remote debug, xdebug) ================
Инструкция (для тех, кто попадёт сюда с поиска).
Что нужно для настройки дебаггинга удалённо (потому что, блин, пришлось поковыряться).
Ниже даны секции по PHPStorm и Eclipse PDT.

Дано:
Компьютер №1:
Windows + PhpStorm.

Компьютер №2:
Debian + Апач удалённо.

Задача: организовать синхронный дебаггинг между компьютерами.

Важно: шторм будет идти по шагам по вашему файлу, а "слушать" отчёт xdebug, который транслирует, идя по файлам на удалённом сервере.
Поэтому файл, открытый в шторме, должен быть точной копией того, что выполняется на сервере.

Шаги:
1. На сервере устанавливаем xdebug, настраиваем php.ini
6ff3e74f4c7747a196772da98976f737.png

В нём я переменную xdebug.remote_enable отключил, потому что на шторм начинают сыпаться запросы со всех сайтов на сервере =)

Эту переменную инициализировал через .htaccess именно в той директории, откуда провожу отладку:
php_flag xdebug.remote_enable on

(!) в рамках всего сайта:
Чтобы работало так: для обычных пользователей дебаггинг отключен, а для вас стартует — в htaccess прописываем:
<If "%{REMOTE_ADDR} == '137.126.15.14'">
	php_flag xdebug.remote_enable on
</If>

... где 137.126.15.14 — ваш IP адрес (аналог php-переменной $_SERVER[ 'REMOTE_ADDR' ])

Можно htaccess настроить более тонко, чтобы админка не прерывалась в дебаг (или наоборот).
Пример конфига (REQUEST_URI не захотело использовать, хз почему — в phpinfo() они определены):
<If "%{REMOTE_ADDR} == '137.126.15.14' && ! %{THE_REQUEST} =~ m#/bitrix/#">
	php_flag xdebug.remote_enable on
	php_flag xdebug.remote_autostart on
</If>


Если на сервере / на сайте работают разные программисты, можно разделение дебаг-потоков сделать через трансляцию на разные порты в зависимости от пользователя (IP-адреса клиента):
<If "%{REMOTE_ADDR} == '137.126.15.14' && ! %{THE_REQUEST} =~ m#/bitrix/#">
	php_flag xdebug.remote_enable on
	php_flag xdebug.remote_autostart on
	php_value xdebug.remote_port 9013
</If>

... соответственно, ориентируясь на IP и запрошенный урл, дебаггер транслирует информацию на определённый порт. Программисту остаётся правильно установить туннель.

2. Пробрасываем SSH-туннель.
Задача: сделать так, чтобы на порт 9007 компьютера №1 поступала информация, которая транслируется на порт 9002 компьютера №2.

Исходя из формулировки, благодаря этому способу можно пробросить туннель, если порты отличаются.
Например, вам достался сервер, на который у вас есть SSH-доступ, но нет возможности менять порт xdebug. Или локально порт занят и вам нужно какой-то нестандартный.
То есть реально пробросить например туннель, который на порт 9007 компьютера №1 будет транслировать информацию с порта 9002 компьютера №2. Сервер пушит инфу на 9002, а вы на локальном компьютере слушаете порт 9007 .

Сделал это через putty:
ff4ab5092dce4326bca9914a4f7168fc.png

...как проверить?
83cd6ae9cd5549269205de6191acade8.png

================ PHPStorm ================
3. На компьютере ставим слушать порт 9007 (в моём случае):
Меню File / Settings / Languages & Frameworks / PHP / Debug + кнопочка "Start Listening for PHP Debug Connections"
7c5b067e84c34c3da9cebdb30d151742.png
+
916b5cee651c4283bbc48bf997528376.pngUPD: прослушка порта (вкл/выкл).

Вот скриншот, которого очень не хватает во всех раскопаных туториалах:
805110c8b3bb43a19192778aac36aac8.pngРезультат: когда шторм слушает порт и мы в обычном браузере открываем страницу, которая находится в разделе, пинаюшем xdebug.remote_enable, шторм перехватывает сигнал и ведёт его уже через свой дебаггер.
Нужно только не забыть либо поставить breakpoint, либо опцию Break at first line in PHP script, иначе скрипт просто пролетит и даже не заметишь =)

По поводу соответствия / несоответствия файлов локально и удалённо: если шторм замечает, что не может сопоставить файлы, он выдаст предупреждение и предложит настроить маппинг:
7d2f592f1d0343759d9ab296a64c8c26.png

================ ECLIPSE PDT ================
Настройка под Eclipse PDT.
Шаги на сервере и туннеля остаются те же.

Переходим в Windows / Preferences / PHP / Servers.

Там создаём новый сервер:
8390f852457e43afa51c56194fa26bfb.png

Заходим в него снова и донастраиваем появившиеся вкладки:
e3818d1a963541c4ae83e613151be318.png

Ставим созданный сервер по-умолчанию:
e76298e9b1ea445d9e7347ac853936e5.png

Поставим ещё, чтобы дебаггер break-нулся с первой же строчки (потом можно отключить и использовать breakpoints):
dc558e98f2e74b49b499799e7697c02e.png

Когда убедимся, что всё работает, — рекомендуется проводить то же, но индивидуально для конкретного проекта: через Property проекта, либо через Debug Configuration:

f96c1932cb334e39bea70d11952878f8.png

Всё.
Теперь, когда на порт 9007 поступит сигнал, Eclipse встрепенётся:
6c181c46964248f59a57a1d08fcb16b6.png

Принимаем сигнал и начинаем отладку.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
kylt_lichnosti
@kylt_lichnosti
Ну со штормом вполне штатная ситуация. Откуда ему знать какого класса там объект и объект ли вообще. Надо в аннотации указать.
Переменная должна еще и подсвечиваться в шторме если идет обращение к методам и он не знает ее класс.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы