Исходные данные такие:
- денвер занял виртуальный диск 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
[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".
УРА! Вот этого я и хотел. А теперь спатки. Завтра работа пойдет в разы быстрее...
-----------------------------------------------------------------------------------------------------------
Пять часов утра и я нашел другую возможность пользоваться дебаггером на всю катушку. Себе сказал "как-то тупо каждый раз указывать какой файл хочешь подебажить! А как же запускать скрипт из браузера?". И ручки сами полезли шарить по настройкам.
Все в том же 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. В результате эклипс полез в браузер и открыл исходную страничку, а сам остановил выполнение скрипта в точке останова.
УРА! Вот этого я и хотел. А теперь спатки. Завтра работа пойдет в разы быстрее...
молодец парень!
ОтветитьУдалитьСпасибо, старался написать такой пост, как люблю читать сам.
ОтветитьУдалитьПомню слова Архангельского в "таймдрайве" - вы не можете использовать больше 24 часа в день, но вы можете экономить миллионы часов другим. С тех пор, если что-то далось мне сложно - я рисую подробную карту.
Кстати, по подобным постам переходов на блог больше всего (если сравнивать с постами типа "я сегодня встал с правой ноги и споткнулся об порог левой", коих у меня завались).
Кстати вы случайно как настроить слеши - дело в том что в скриптах указаны скажем require($_SERVER["DOCUMENT_ROOT"]."/modules/ ...
ОтветитьУдалитьно так как я использую эклипс на "винде" - то слеши там в обратную сторону.
В итоге сама отладка чистым xdebugом проходит на ура (например профайлинг), а вот отладка xdebugом в эклипсе прерывается на этих самых слешах))
Думаю есть там какая-нибудь магическая настройка)) Заранее спасибо.
хотел сказать: Кстати вы случайно не знаете как настроить слеши ...
ОтветитьУдалитьЗдравствуйте, спасибо за вопрос. Попробуем разобраться. Как проявляется "прерывание отладки 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) на время воспользуйтесь не абсолютным путем а относительным.
А после подумаем, что делать дальше.
А так, в проекте слэши в обратную сторону для винды не проблема. Она их понимает очень хорошо. К примеру блокнот можно запустить (Пуск-Выполнить) несколькими способами.
ОтветитьУдалитьfile://c:/windows/system32/notepad.exe
c:/windows/system32/notepad.exe
c:\windows\system32\notepad.exe
Потому думаю, что для винды это не проблема. Корень зла возможно в другом. И пока кажется, что это "$_SERVER["DOCUMENT_ROOT"]".
Этот комментарий был удален автором.
ОтветитьУдалитьВот что удалось нарыть по этой переменной. 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: - виртуальный диск созданный денвером. Тут слешы прямые.
А у Вас как?
Денвер, xDebug, netbeans.
ОтветитьУдалитьтоже проблема с путями.
Везде на сайте указаны абсолютные пути типа:
$_SERVER['DOCUMENT_ROOT'].'/common/core/class.SorterQuery.php';
И отладка к сожалению не стартует. ошибки при подключении файлов
У меня к примеру во всех скриптах импортирование происходит так:
ОтветитьУдалитьrequire_once "./classes/db.class.php";
у меня такой метод включения не работает.)))
vhosts.conf схожи с Вашими.
корень зла действительно в $_SERVER["DOCUMENT_ROOT"]. Вы были правы. При дебаге, эта переменная остаеться пустая, и соответственно, никакие пути не работают. Поэтому, приходиться в каждом файле делать проверку типа
ОтветитьУдалитьif (empty($_SERVER["DOCUMENT_ROOT"]) {
$_SERVER["DOCUMENT_ROOT"] = /*абсолютный путь прописаный ручками*/
}
это не красиво, но к сожалению на данный момент других альтернатив не вижу.
есть идеи?
Если этот вариант работает, то не вижу тратить время на поиски другой альтенативы, думаю у Вас есть намного более приоритетные задачи. Когда же приоритет дойдет до этого таска, можно погуглить.
ОтветитьУдалитьКак вариант, чтобы не прописывать свои данные в кишках, можно было бы в самом рутовом скрипте сделать переменную типа $base_dir и в нее записать:
if (empty($_SERVER["DOCUMENT_ROOT"]) {
$base_dir = /*абсолютный путь прописаный ручками*/
} else {
$base_dir = $_SERVER["DOCUMENT_ROOT"];
}
а потом пользоваться везде $base_dir для получения абсолютного пути к скрипту.
Как-то так.
Только объявлять не переменную $base_dir а константу BASE_DIR - удобнее и безопаснее ихмо
ОтветитьУдалитьИМХО блин )))
ОтветитьУдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьРебята, спасибо за комментарии
ОтветитьУдалитьПоставил эклипс сегодня. та же самая проблема с $_SERVER["DOCUMENT_ROOT"]
ОтветитьУдалитьСправился?
ОтветитьУдалитьНеа. Вручную прописываю, если пусто...
ОтветитьУдалитьМожет ну его этот эклипс?
ОтветитьУдалитьНа странице разработчиков http://www.eclipse.org/pdt/downloads/
ОтветитьУдалитьесть два варианта Eclipse PDT 2.2.0 и PDT 2.1 SR-2 чем они отличаются?
Одна из них (2.2.0) более поздняя. Та, что 2.1 + SR2 - я так понимаю прошлая стабильная версия + сервис паки.
ОтветитьУдалитьГде-то на том же сайте должно быть и описание всех релизов - там детально можно почитать что вошло в новый релиз.
Я же поступил бы так - скачал последнюю версию, и если все комфортно - оставил бы как есть. Если же глючит - скачал бы старую с полным набором патчей.
добрый день, у меня другая проблема - кодировку win1251 дебагер не понимает показывает абракодабру в отладке, никто не разобрался как подправить?
ОтветитьУдалитьК сожалению, у меня это была разовая акция. Но я бы копал в направлении http://www.google.ru/#q=eclipse+pdt+win1251+debug с верой в то, что ответ есть и он достаточно прост. Так родился этот пост - несколько часов поиска и около сотни неудачных экспериментов и оп! Все заработало.
ОтветитьУдалитьОтличная статья! Всё сразу стало ясно, а то полдня искал что-то хоть на каком языке.
ОтветитьУдалитьБлагодарю за комментарий.
ОтветитьУдалитьСпасибо за статью. Сам правда ставил вот из этого руководства.
ОтветитьУдалитьhttp://docs.joomla.org/Setting_up_your_workstation_for_Joomla%21_development
Все поставилось, но из-за языкового барьера не все было понятно. Благодаря статье восполнил пробелы. :)
Остался один вопрос. Я вот запустил через дебагер сайт. Он прервался на том брейкпоинте, который я поставил. Первую страницу отработал, а когда я через встроенный браузере делаю на странице какие-то действия, он у меня не прерывается на брейкпоинтах. Так должно быть? Я думал он у меня и дальше будет брейкпоинты обрабатывать.. иначе как вообще отлаживать? Или я чего-то не понимаю?..
Дракон, спасибо за комментарий.
ОтветитьУдалитьНасколько я помню, то в случае отладки в браузере открывается страничка URL которой не простой http://localhost/test.php а имеет какой-то параметр, который важен. Вероятно во встроенном браузере этот параметр не указан. Это первое что пришло в голову.
Вообще то дебаг в ПХП по сравнению с той же java мне показался очень нестабильным - иногда возникали какие-то глюки, когда приходилось тупо перегружать комп, чтобы можно было продолжить дебажить.
Сложно мне ответить что у вас является причиной. Пробуйте, ковыряйте, и уверен у вас получится
Действительно, во внешнем браузере (пробовал через файрфокс) дебаг работает так как я и ожидал. Вчера сам до этого дошел, отписаться уже не успел, затянуло в разработку :)
ОтветитьУдалитьЧерез внешний браузер даже удобней. Когда работаешь на двух мониторах.
Спасибо за советы. Подписываюсь на блог.
Затянуло в разработку - красиво звучит. Успехов и спасибо за комментарий.
ОтветитьУдалитьвсе поставил по инструкции (правда у меня php 3.5) все нормуль работает. респект автору.
ОтветитьУдалить