Если нельзя, но очень хочется, то нужно обязательно и ничего в мире не стоит того, чтобы делать из этого проблему!


Интересна Java? Кликай по ссылке и изучай!
Если тебе полезно что-то из того, чем я делюсь в своем блоге - можешь поделиться своими деньгами со мной.
с пожеланием
столько времени читатели провели на блоге - 
сейчас онлайн - 

вторник, 2 февраля 2010 г.

Eclipse PDT + xdebug + denwer

Сегодня задача была подружить Eclipse с Денвером и сделать возможным debug с помощью xdebug. В результате собралось пару линков, которыми хотел бы поделиться с тем, кого это может заинтересовать.Если заинтересовало - кликаем тут.

Исходные данные такие:
- денвер занял виртуальный диск K:
- проект размещен в папке K:\home\dev.bla.ua\www
- денвер был скачан с http://www.denwer.ru/ и я выбрал версию PHP 5.2 потому, что там было больше модулей и ZendOptimizer (ХЗ пока, что это, но я повелся). Тут выжны две вещи: версия PHP и наличие Zend.

Eclipse я скачал этот "PDT 2.1 SR-1 All In Ones / Eclipse PHP Package" с http://www.eclipse.org/pdt/downloads/.

Сразу распаковал его и запустил. Первым делом он у меня спросил в какой папке я хочу организовать воркспейс. С перепугу я ему ответил, что в K:\home\dev.bla.ua, после чего он успешно разместил там свою папку ".metadata".

Дальше я выбрал меню File-New-New PHP project и выбрал папку "Create new project in workspace", а проект назвал так же как и папку "www", на что эклипс мне сообщил, что он все файлы, размещенные в этой папке добавит в проект. Мне этого как раз и надо было. Нажал Next и сделал на автомате все что он просил. После импорта в PHP Explorer отобразилась корневая папка www и все файлы проекта (см. ниже). Супер!
 
 

Дальше я углубился в интернет с тем, чтобы отыскать ответ на вопрос "как мне установить xdebug". Перелопатив купу страниц я вышел на несколько, которые содержали именно то, что мне надо.
http://fstrange.ru/coder/2009_08_26/denver-eclipse-xdebug/
http://robsnotebook.com/php_debugger_pdt_xdebug
А тут (http://xdebug.org/download.php) скачал сам xdebug. Важно, что для каждой версии PHP поставляется своя версия xdebug расширения.

Ответить на вопрос какая именно у меня версия PHP я смог воспользовавшись функцией phpinfo(). Если ее написать в любом скрипте, а потом вызвать его из браузера - то на экран вывалится бооольшущий кусок информации про все, что относится к PHP, базам, вебсерверам и еще много всякий инфы. Там на самом верху я узрел 5.2.12. После чего выбрал нужный релиз xdebug (для меня это версия 2.0.5 для PHP5.2 - http://xdebug.org/files/php_xdebug-2.0.5-5.2.dll).

Этот файлик разместил в K:\usr\local\php5\ext рядом с другими экстеншенами для PHP.

После чего отправился к файлу настроек K:\usr\local\php5\php.ini и в нем немного пошаманил, а именно:
- в самом конце файла после блока с инициализацией Zend
[Zend]
zend_extension_ts = "/usr/local/php5/zend/ZendExtensionManager.dll"
zend_extension_manager.optimizer_ts="/usr/local/php5/zend/"
zend_optimizer.enable_loader = 1
zend_optimizer.optimization_level = 15
я разместил такие настройки:
[xdebug]
xdebug.remote_enable=1
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.remote_handler="dbgp"
zend_extension_ts="K:\usr\local\php5\ext\php_xdebug-2.0.5-5.2.dll" 
- а все, что касается Zend заремарил нафиг (как оказалось xdebug и zend не дружат - об этом мне мило сообщил эклипс так: "PHP Fatal error:  [Zend Optimizer] Zend Optimizer 3.3.3 is incompatible with Xdebug 2.0.5 in Unknown on line 0"). Если бы я сказал денвер с версией PHP5.3, тогда у меня не было бы Zend и заремаривать ничего не пришлось бы, а так я добавил по знаку ";" перед каждой строчкой:
[Zend]
;zend_extension_ts = "/usr/local/php5/zend/ZendExtensionManager.dll"
;zend_extension_manager.optimizer_ts="/usr/local/php5/zend/"
;zend_optimizer.enable_loader = 1
;zend_optimizer.optimization_level = 15
- дальше, руководствуясь советами приведенных выше источников, я изменил юниксовый способ указания папок на виндовый (просто поменяв слеши с "/" на "\" и указав абсолютный путь) в этом же php.ini. Было так:
;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;

; UNIX: "/path1:/path2"
include_path = ".;/usr/local/php5/PEAR" ; тут разремарено, хотя с какого перепугу? 
;
; Windows: "\path1;\path2"
;include_path = ".;c:\php\includes" ; тут заремарено было, хотя у меня винда...

; ... тут пару блоков, которые я пропустил ибо в них ничего не менялось. 

; Directory in which the loadable extensions (modules) reside.
extension_dir = "/usr/local/php5/ext" ; и тут
стало так:
;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;

; UNIX: "/path1:/path2"
; include_path = ".;/usr/local/php5/PEAR" ; это вообще заремарил
;
; Windows: "\path1;\path2"
include_path = ".;K:\usr\local\php5;K:\usr\local\php5\PEAR;" ; это разремарил и указал места, где у меня все находится

;...пару левых блоков

; Directory in which the loadable extensions (modules) reside.
extension_dir = "K:\usr\local\php5\ext" ; и тут тоже поправдивее сделал
Дальше я поднял денвер и направился в эклипс. Там кликнул  меню Run-Debug Configurations... В предлагаемом диалоговом окне создал новую конфигурацию (имя любое).
В этой конфигурации кликнул на линк "PHP executables"
 
В диалоге Preferences нажал кнопку Add.
В следующем диалоге (ну блин и эклипс :) ) указал путь к php.exe и php.ini файлам, а так же выбрал XDebug как дебаггер. Имя можно давать любое.
 
После жмем Finish, на втором диалоге (Preferences) Ok, а на первом (Debug configurations) выбираем XDebug как дебаггер и файл, который мы хотим отладить. 
  
Жмем дебаг и переходим (по запросу эклипса) в PHP debug perspective. 
 
Если где-то на старте стояла точка останова, то мы увидим такую картину...
Надеюсь этот пост сэкономит кому-то время. Ссори, если написано сумбурно - сейчас 4 часа утра, а мне еще предстоит до завтра отладить один скриптик.
-----------------------------------------------------------------------------------------------------------

Пять часов утра и я нашел другую возможность пользоваться дебаггером на всю катушку. Себе сказал "как-то тупо каждый раз указывать какой файл хочешь подебажить! А как же запускать скрипт из браузера?". И ручки сами полезли шарить по настройкам.

Все в том же Run-Debug Configurations... создадим конфигурацию, только теперь "Php web page".
 
Server debugger выберем XDebug. В поле File - я выбрал индексную страничку. Галочка Break at first line - говорит будет ли дебаггер останавливаться на каждом php скрипте, как только его увидит. В блоке Url я снял галочку Auto Generate, потому что в проекте используется RewriteEngine и исходный скрипт запускается по другому. 
 
После кликнул на кнопку Configure и в предлагаемом диалоге ввел правильное имя хоста. 
  
После нажал на Ok, а в диалоге Debug Configuration на Apply а потом Debug. В результате эклипс полез в браузер и открыл исходную страничку, а сам остановил выполнение скрипта в точке останова. 

УРА! Вот этого я и хотел. А теперь спатки. Завтра работа пойдет в разы быстрее...

31 комментарий:

  1. молодец парень!

    ОтветитьУдалить
  2. Спасибо, старался написать такой пост, как люблю читать сам.

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

    Кстати, по подобным постам переходов на блог больше всего (если сравнивать с постами типа "я сегодня встал с правой ноги и споткнулся об порог левой", коих у меня завались).

    ОтветитьУдалить
  3. Кстати вы случайно как настроить слеши - дело в том что в скриптах указаны скажем require($_SERVER["DOCUMENT_ROOT"]."/modules/ ...
    но так как я использую эклипс на "винде" - то слеши там в обратную сторону.
    В итоге сама отладка чистым xdebugом проходит на ура (например профайлинг), а вот отладка xdebugом в эклипсе прерывается на этих самых слешах))

    Думаю есть там какая-нибудь магическая настройка)) Заранее спасибо.

    ОтветитьУдалить
  4. хотел сказать: Кстати вы случайно не знаете как настроить слеши ...

    ОтветитьУдалить
  5. Здравствуйте, спасибо за вопрос. Попробуем разобраться. Как проявляется "прерывание отладки xdebug на слешах в эклипсе" - выдается какое-то сообщение или быть может, как-то по другому?

    У меня к примеру во всех скриптах импортирование происходит так:
    require_once "./classes/db.class.php";
    require_once "./classes/registration.class.php";
    require_once "./classes/forum.class.php";
    require_once "./classes/image.class.php";
    require_once "./cfg.php";
    require_once "./auth.php";

    без указания рута $_SERVER["DOCUMENT_ROOT"].

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

    Попробуйте 1) опишите как проявляется прерывание дебага - чтобы я видел картинку так же как и вы.
    2) на время воспользуйтесь не абсолютным путем а относительным.

    А после подумаем, что делать дальше.

    ОтветитьУдалить
  6. А так, в проекте слэши в обратную сторону для винды не проблема. Она их понимает очень хорошо. К примеру блокнот можно запустить (Пуск-Выполнить) несколькими способами.

    file://c:/windows/system32/notepad.exe
    c:/windows/system32/notepad.exe
    c:\windows\system32\notepad.exe
    Потому думаю, что для винды это не проблема. Корень зла возможно в другом. И пока кажется, что это "$_SERVER["DOCUMENT_ROOT"]".

    ОтветитьУдалить
  7. Этот комментарий был удален автором.

    ОтветитьУдалить
  8. Вот что удалось нарыть по этой переменной. http://www.ewgenij.net/apache-virtual-hosts.html

    Вот как прописан рабочий виртуальный хост (в файле K:\usr\local\apache\conf\vhosts.conf) моего проекта, который удается дебажить без проблем.

    # Host /home/dev.bla.ua/www (5):
    #Listen 127.0.0.1:80
    #NameVirtualHost 127.0.0.1:80
    <VirtualHost 127.0.0.80>
    DocumentRoot "K:/home/dev.bla.ua/www"
    ServerName "dev.bla.ua"
    ServerAlias "dev.bla.ua" "www.dev.bla.ua"
    ScriptAlias /cgi/ "/home/dev.bla.ua/cgi/"
    ScriptAlias /cgi-bin/ "/home/dev.bla.ua/cgi-bin/"
    </VirtualHost>

    # Host /home/dev.bla.ua/www (6):
    #Listen 127.0.0.1:443
    #NameVirtualHost 127.0.0.1:443
    <VirtualHost 127.0.0.1:443>
    SSLEngine on
    DocumentRoot "K:/home/dev.bla.ua/www"
    ServerName "dev.bla.ua"
    ServerAlias "dev.bla.ua" "www.dev.bla.ua"
    ScriptAlias /cgi/ "/home/dev.bla.ua/cgi/"
    ScriptAlias /cgi-bin/ "/home/dev.bla.ua/cgi-bin/"
    </VirtualHost>

    где K: - виртуальный диск созданный денвером. Тут слешы прямые.

    А у Вас как?

    ОтветитьУдалить
  9. Денвер, xDebug, netbeans.
    тоже проблема с путями.
    Везде на сайте указаны абсолютные пути типа:
    $_SERVER['DOCUMENT_ROOT'].'/common/core/class.SorterQuery.php';
    И отладка к сожалению не стартует. ошибки при подключении файлов

    ОтветитьУдалить
  10. У меня к примеру во всех скриптах импортирование происходит так:
    require_once "./classes/db.class.php";
    у меня такой метод включения не работает.)))
    vhosts.conf схожи с Вашими.

    ОтветитьУдалить
  11. корень зла действительно в $_SERVER["DOCUMENT_ROOT"]. Вы были правы. При дебаге, эта переменная остаеться пустая, и соответственно, никакие пути не работают. Поэтому, приходиться в каждом файле делать проверку типа
    if (empty($_SERVER["DOCUMENT_ROOT"]) {
    $_SERVER["DOCUMENT_ROOT"] = /*абсолютный путь прописаный ручками*/
    }
    это не красиво, но к сожалению на данный момент других альтернатив не вижу.
    есть идеи?

    ОтветитьУдалить
  12. Если этот вариант работает, то не вижу тратить время на поиски другой альтенативы, думаю у Вас есть намного более приоритетные задачи. Когда же приоритет дойдет до этого таска, можно погуглить.

    Как вариант, чтобы не прописывать свои данные в кишках, можно было бы в самом рутовом скрипте сделать переменную типа $base_dir и в нее записать:
    if (empty($_SERVER["DOCUMENT_ROOT"]) {
    $base_dir = /*абсолютный путь прописаный ручками*/
    } else {
    $base_dir = $_SERVER["DOCUMENT_ROOT"];
    }
    а потом пользоваться везде $base_dir для получения абсолютного пути к скрипту.

    Как-то так.

    ОтветитьУдалить
  13. Анонимный18 мая 2010 г., 11:32

    Только объявлять не переменную $base_dir а константу BASE_DIR - удобнее и безопаснее ихмо

    ОтветитьУдалить
  14. Анонимный18 мая 2010 г., 11:37

    ИМХО блин )))

    ОтветитьУдалить
  15. Этот комментарий был удален автором.

    ОтветитьУдалить
  16. Ребята, спасибо за комментарии

    ОтветитьУдалить
  17. Поставил эклипс сегодня. та же самая проблема с $_SERVER["DOCUMENT_ROOT"]

    ОтветитьУдалить
  18. Неа. Вручную прописываю, если пусто...

    ОтветитьУдалить
  19. На странице разработчиков http://www.eclipse.org/pdt/downloads/
    есть два варианта Eclipse PDT 2.2.0 и PDT 2.1 SR-2 чем они отличаются?

    ОтветитьУдалить
  20. Одна из них (2.2.0) более поздняя. Та, что 2.1 + SR2 - я так понимаю прошлая стабильная версия + сервис паки.

    Где-то на том же сайте должно быть и описание всех релизов - там детально можно почитать что вошло в новый релиз.

    Я же поступил бы так - скачал последнюю версию, и если все комфортно - оставил бы как есть. Если же глючит - скачал бы старую с полным набором патчей.

    ОтветитьУдалить
  21. добрый день, у меня другая проблема - кодировку win1251 дебагер не понимает показывает абракодабру в отладке, никто не разобрался как подправить?

    ОтветитьУдалить
  22. К сожалению, у меня это была разовая акция. Но я бы копал в направлении http://www.google.ru/#q=eclipse+pdt+win1251+debug с верой в то, что ответ есть и он достаточно прост. Так родился этот пост - несколько часов поиска и около сотни неудачных экспериментов и оп! Все заработало.

    ОтветитьУдалить
  23. Отличная статья! Всё сразу стало ясно, а то полдня искал что-то хоть на каком языке.

    ОтветитьУдалить
  24. Спасибо за статью. Сам правда ставил вот из этого руководства.
    http://docs.joomla.org/Setting_up_your_workstation_for_Joomla%21_development
    Все поставилось, но из-за языкового барьера не все было понятно. Благодаря статье восполнил пробелы. :)

    Остался один вопрос. Я вот запустил через дебагер сайт. Он прервался на том брейкпоинте, который я поставил. Первую страницу отработал, а когда я через встроенный браузере делаю на странице какие-то действия, он у меня не прерывается на брейкпоинтах. Так должно быть? Я думал он у меня и дальше будет брейкпоинты обрабатывать.. иначе как вообще отлаживать? Или я чего-то не понимаю?..

    ОтветитьУдалить
  25. Дракон, спасибо за комментарий.

    Насколько я помню, то в случае отладки в браузере открывается страничка URL которой не простой http://localhost/test.php а имеет какой-то параметр, который важен. Вероятно во встроенном браузере этот параметр не указан. Это первое что пришло в голову.

    Вообще то дебаг в ПХП по сравнению с той же java мне показался очень нестабильным - иногда возникали какие-то глюки, когда приходилось тупо перегружать комп, чтобы можно было продолжить дебажить.

    Сложно мне ответить что у вас является причиной. Пробуйте, ковыряйте, и уверен у вас получится

    ОтветитьУдалить
  26. Действительно, во внешнем браузере (пробовал через файрфокс) дебаг работает так как я и ожидал. Вчера сам до этого дошел, отписаться уже не успел, затянуло в разработку :)

    Через внешний браузер даже удобней. Когда работаешь на двух мониторах.

    Спасибо за советы. Подписываюсь на блог.

    ОтветитьУдалить
  27. Затянуло в разработку - красиво звучит. Успехов и спасибо за комментарий.

    ОтветитьУдалить
  28. все поставил по инструкции (правда у меня php 3.5) все нормуль работает. респект автору.

    ОтветитьУдалить