Я Microsoft Scum и привык к наличию инсталляторов, после успешного выполнения которых у меня на машине установлено и настроено всё необходимое.
С PHP оказалось не так, что привело к нескольким часам мучений и ложных ходов, для устранения которых я и написал эту статью.
Как это работает
Будучи web-разработчиком под ASP.NET ещё с 2003 года, я привык, что разрабатываемое приложение крутится на IIS. Сейчас вместе со Студией ставится компактная версия IIS, и, признаться, разработка под ним в большинстве случаев гораздо удобнее развёртывания дополнительной разработческой среды под полноценным IIS.
У PHP также есть режим запуска в качестве сервера с выбором корневой директории приложения. Однако, выяснилось, что такой режим не позволяет по-человечески отлаживать продукт. По этой причине мы будем воссоздавать более или менее родную среду для работы фреймворков: Apache+PHP. При этом возможность отладки и тестирования обеспечивается отдельными модулями, у которых есть конкретная сборка под конкретную сборку PHP без каких-либо свобод выбора. Оно и к лучшему — отсутствие свободы выбора версий ограничивает нас всего одним сценарием установки. Его то мы и опишем.
В статье будут использованы значения по умолчанию для 64-битной Винды. Для 32-битной разница лишь в том, что вместо папки C:Program Files (x86) надо использовать папку C:Program Files.
Целевая конфигурация
- PHP 5.4 (5.4.15) TS x86 — многопоточная версия PHP 5.4. Её безглючность не гарантируется, однако, у однопоточного отсутствуют жизненно важная для работы с Apache php5apache2_4.dll, так что ставим многопоточный PHP, крестимся и едем дальше;
- xDebug 2.2.2 — я решил не пользоваться стандартным Zend Debugger, поскольку индивидуальный web-сервер не нуждается в коллективной отладке, а вот точность при работе профайлера может оказаться крайне полезной;
- PHPUnit — поскольку предполагается, что разработчик искушен не только хорошими средствами разработки, но и хорошими средствами поддержки функционала в процессе последующих изменений, а также не брезгует пользоваться разными вендорскими фреймворками вроде Symfony, модульное тестирование просто необходимо;
- Apache 2.4.4 — всё вышеперечисленное мы будем раскручивать под самой современной на момент последней правки данной статьи версией Апача;
- JetBrains PhpStorm 6 — лично для меня он удобнее, чем бесплатные аналоги, а также он прекрасно интегрирован с PHP, хотя и будут нюансы.
Ставим PHP 5.4
На момент написания статьи инсталлятора не предлагалось, поэтому ставим что есть:
- логинимся под учетной записью с административными правами;
- windows.php.net/download/#php-5.4 — качаем zip-архив VC9 x86 (http://windows.php.net/downloads/releases/php-5.4.15-Win32-VC9-x86.zip ); любители жесткого хардкора могут скачать соответствующий Debug Pack, но у меня предложенная сборка пока ни разу не упала;
- распаковываем содержимое zip-архива в папку «C:Program Files (x86)PHPv5.4» (думаю, гипотетический инсталлятор поставил бы всё именно туда);
- внутри полученной папки запускаем скрипты «pws-php5cgi.reg» и «pws-php5isapi.reg» (это не обязательно, но так PHP пропишется в IIS и даст возможность захостить ваш шедевр);
- копируем «php.ini-development» в «php.ini»
- открываем «php.ini», находим там блок:
; Directory in which the loadable extensions (modules) reside. ; http://php.net/extension-dir ; extension_dir = "./" ; On windows: ; extension_dir = "ext"
и снимаем комментарий с последней строки, получится:
; Directory in which the loadable extensions (modules) reside. ; http://php.net/extension-dir ; extension_dir = "./" ; On windows: extension_dir = "ext"
- всё в том же php.ini находим блок:
[Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone date.timezone =
и прописываем там зону, в которой находится компьютер (у меня это «Europe/Moscow», php.net/manual/en/timezones.php содержит информацию о поддерживаемых зонах):
[Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone date.timezone = "Europe/Moscow"
- лезем в StartControl PanelSystemAdvanced System Settings, там в Environment Variables в списке System Variables находим переменную «Path» и добавляем через ";" путь «C:Program Files (x86)PHPv5.4»
- Открываем cmd и убеждаемся, что команда 'php -v' (регистр имеет значение) выдает информацию по установленной версии PHP (в гайде это 5.4.15).
Готово.
Ставим XDebug 2.2.2
Инсталлятора традиционно нет, так что:
- вроде мы уже залогинены под админом…
- xdebug.org/download.php — качаем 5.4 VC9 (32 bit), который без суффикса TS xdebug.org/files/php_xdebug-2.2.2-5.4-vc9.dll — это как раз для многопоточного PHP 5.4; это сразу .dll, поэтому браузер может выразить сомнение в целесообразности скачивания — убедите его;
- скаченный файл кладем в папку «C:Program Files (x86)PHPv5.4ext»— в этой папке лежат все расширения PHP;
- открываем php.ini (любым редактором, но обязательно в режиме Run as administrator…, иначе наши правки не удастся сохранить) и добавляем блок:
[XDebug] ; http://xdebug.org/wizard.php zend_extension = extphp_xdebug-2.2.2-5.4-vc9-nts.dll xdebug.remote_enable=1 xdebug.remote_port="9000" xdebug.profiler_enable=1 xdebug.profiler_output_dir="D:TempXDebugProfiler" xdebug.remote_host = "localhost"
- открываем cmd и переходим в папку, которую не жалко засорить одним файлом;
- запускаем в ней команду: «php -i > out.txt» — в текущей директории появится 30 килобайт информации о конфигурации php;
- xdebug.org/wizard.php — идем на страницу настройки xdebug, вставляем содержимое «out.txt» в большое белое поле и нажимаем [Analyze my phpinfo() output], должен получиться следующий результат:
SUMMARY
• Xdebug installed: 2.2.2
• Server API: Command Line Interface
• Windows: yes — Compiler: MS VC9 — Architecture: x86
• Zend Server: no
• PHP Version: 5.4.14
• Zend API nr: 220100525
• PHP API nr: 20100525
• Debug Build: no
• Thread Safe Build: no
• Configuration File Path: C:Windows
• Configuration File: C:Program Files (x86)PHPv5.4php.ini
• Extensions directory: ext
YOU'RE ALREADY RUNNING THE LATEST XDEBUG VERSION
But here are the instructions anyway:
1. Download
2. Move the downloaded file to ext
3. Update C:Program Files (x86)PHPv5.4php.ini and change the line
zend_extension = extНадпись капслоком самая важная. Если вдруг завтра выйдет свежая версию XDebug, пишите, я его себе тоже поставлю.
Готово.
Ставим PHPUnit
- pear.php.net/go-pear.phar — скаченный файл кладем в папку «C:Program Files (x86)PHPv5.4» (phar — это файл с дистрибутивом приложения, запустить дистрибутив можно командой «php file_name.phar» в консоли);
- запускаем command prompt от имени администратора, переходим в папку «C:Program Files (x86)PHPv5.4» и вызываем команду «php go-pear.phar», на вопросы скрипта отвечаем «system», в следующем вопросе нажимаем Enter (или принимаем все локации директорий по умолчанию), позволяем отредактировать php.ini (инсталлятор пропишет «C:Program Files (x86)PHPv5.4pear в качестве инклюд-пути»);
- в результате выполнения предыдущего пункта появляется система управляния PHP-паками (аналогично NuGet для Студии), которая использует онлайн-репозитории — добавим туда репозиторий PHPUnit, введя в command prompt (под админом) команду «pear channel-discover pear.phpunit.de» (не смотря на прокси, у меня всё получилось, в противном случае проверьте правильность настроек прокси-сервера в Винде и его работоспособность);
- если в command prompt ввести команду «pear remote-list -c phpunit», то станет ясно, что помимо самого PHPUnit там есть много других печенек, но пока мы поставим только саму основу, а дополнительные модули будем добавлять по мере необходимости: «pear install phpunit/phpunit»;
Готово.
Обновление PHPUnit и других модулей, установленных с помощью PEAR, делается командой «pear upgrade-all». Вообще, рекомендую почитать инструкцию по PEAR. Опытного разработчика она непременно наведёт на размышления о том, чтобы распространять свои труды не закачкой по FTP, а с использованием всё того же PEAR.
Ставим Apache 2.4
Лично у меня забиты порты 80 (IIS), 8080 (TFS) и 8000 (HTTP proxy). По этой причине я поставил Apache слушать порт 8085. Здесь будут приведены настройки для Apache на порт 8085. Также в качестве корневых директорий я использую «d:wwwApache».
У Апача под Винду есть отдельный сайт www.apachelounge.com/, откуда можно скачать самый свежак. Поскольку PHP у нас x86, то и все .dll-файлы у него x86, поэтому и Apache придется ставить x86.
- www.apachelounge.com/download/ — Качаем httpd-2.4.4-win32.zip и распаковываем содержимое папки «Apache24» архива в папку «C:Program Files (x86)Apache24»;
- открываем на редактирование (под админом) файл C:Program Files (x86)Apache24confhttpd.conf
- находим настройку ServerRoot и ставим
ServerRoot "C:/Program Files (x86)/Apache24"
(С тех пор, как Винда превратилась из графической оболочки над DOS в самостоятельную операционку, ей всё равно, в какую сторону наклонена косая черта, а вот Апачу не всё равно, нам надо использовать строго "/");
- находим настройку Listen и ставим
Listen 8085
- находим настройку DocumentRoot (и следующий за ней блок Directory) и настраиваем наши пути:
DocumentRoot "D:/www/Apache/web" <Directory "D:/www/Apache/web"> # # Possible values for the Options directive are "None", "All", # or any combination of: # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews # # Note that "MultiViews" must be named *explicitly* --- "Options All" # doesn't give it to you. # # The Options directive is both complicated and important. Please see # http://httpd.apache.org/docs/2.4/mod/core.html#options # for more information. # Options Indexes FollowSymLinks # # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # AllowOverride FileInfo AuthConfig Limit # AllowOverride None # # Controls who can get stuff from this server. # Require all granted </Directory>
не забудьте создать эту директорию (вы могли заметить, что в конце пути я добавил поддиректорию web — это связано с тем, что я собираюсь использовать Symfony, который предполагает содержание самого сайта в поддиректории web общего проекта);
- находим список большого количества инструкций LoadModule и раскомментариваем/редактируем/добавляем в хвост настройку
LoadModule php5_module "C:/Program Files (x86)/PHP/v5.4/php5apache2_4.dll"
- не факт, что модуль загрузится, поэтому в последних Apache принято прочие связанные с модулем настройки заклячать в условие IfModule, проверяющее, что модуль загрузился, поэтому находим/добавляем контейнер для настроек PHP-модуля под Apache:
<IfModule php5_module> </IfModule>
- настраиваем модуль PHP под Apache:
<IfModule php5_module> PHPIniDir "C:/Program Files (x86)/PHP/v5.4" AddHandler application/x-httpd-php .php </IfModule>
- находим настройки модуля листинка директории и редактируем её:
<IfModule dir_module> DirectoryIndex index.php index.html </IfModule>
- регистрируем Апач в качестве сервиса командой в command prompt
"C:Program Files (x86)Apache24binhttpd" -k install
- при загрузке Apache будет запускаться автоматически, а сейчас запустим его вручную командой в command prompt
net start Apache2.4
- а теперь посмотрим, как всё это будет взлетать, поместив в директорию «D:wwwApacheweb» файл «index.php»:
<?php phpinfo();
и запросив его из браузера по url http://localhost:8085/
Готово.
Настраиваем PhpStorm 6
www.jetbrains.com/phpstorm/ — качаем, ставим, запускаем PhpStorm 6 (у него есть месяц триала, лично мне этого более чем хватило для приобретения).
Устанавливаем интеграцию с TFS (опционально)
К работе с TFS из среды PhpStorm, как и из других продуктов, использующих среду Idea, придется привыкать. Терминология и поведение существенно отличается от оных в Visual Studio. Тем не менее, пользоваться интеграцией гораздо удобнее. чем бегать в Visual Studio за каждым файлом.
Итак,
- На экране должно быть стартовое окно PhpStorm, если вместо этого окна отображается среда разработки, закрываем текущий проект;
- в правой области стартового окна выбираем Configure/Plugins Идём в File/Settings;
Из среды разработки эта настройка доступна из меню File/Settings. В левой части окна отображается список настроек как проекта, так и среды вцелом. Нужно будет выбрать настройк среды Plugins.
«Настройки проекта» — настройки из списка с заголовком Project Settings,
«Настройки среды» — настройки из списка с заголовком IDE Settings. - в открывшемся списке плагинов убеждаемся, что плагин «TFS Integration» не установлен (по умолчанию он не входит в поставку PhpStorm) и нажимаем кнопку «Install JetBrains plugin» (внизу окна);
- в окне поиска вбиваем «TFS» и щелкаем два раза на строке с плагином «TFS Integration», на вопрос о намерении скачать плагин отвечаем твердым «Yes»;
- дожидаемся окончания установки плагина, закрываем окна настроек и перезапускаем PhpStorm, чтобы свежеустановленный плагин заработал.
Теперь у нас есть среда, готовая работать с TFS.
Создаём или открываем проект
- В папке D:wwwApache создаём новый пустой проект, или открываем уже имеющийся
Помним, что сервер Apache у нас настроен на поддиректорию web, а значит и сам сайт будет находиться в папке web проекта. В будущем рядом с web помимо настроек проекта .idea могут появиться такие подпапки, как vendor для хранения сторонних разработок, test для скриптов тестирования и прочие подпапки для работы фреймворков. - если сайт пустой, то создаём на сайте простейшую страницу index.php с содержимым типа
<?php phpinfo();
- если проект обслуживается системой контроля версий, это необходимо прописать в настройках проекта Version Control.
Настраиваем php-сервер в PhpStorm
- В настройках проекта открываем настройку PHP и настраиваем там:
PHP language level: 5.4
Interpreter: нажимаем "…", указываем Name: PHP 5.4, PHP Home: C:Program Files (x86)PHPv5.4, Debugger: Xdebug;
Include path: нажимаем "+" и указываем «C:Program Files (x86)PHPv5.4pear», чтобы наш проект автоматически подтягивал ранее установленный PHPUnit. - в настройках проекта открываем PHP/Servers — откроется закладка с пустым списком серверов;
- нажимаем "+" для добавления нового сервера и заполняем его данные:
Name: Local Apache
Host: localhost
Port: 8085
Debugger: Xdebug - если в конфигурации Xdebug указан порт, отличный от 9000, то идем в настройки проекта PHP/Debug и там в разделе «Xdebug» настраиваем «Debug port»;
- в настройках проекта открываем PHP/PHPUnit и убеждаемся, что там указано «Load from include path».
Настраиваем web-приложение
- В меню «Run/Edit Configurations» щелкаем на "+", выбираем «PHP Web Application» и заполняем его данные:
Name: My Application at Local Apache
Server: Local Apache
Start URL: стартовая страница (index.php)
Browser: я выбрал Chrome, но для каждой конкретной страницы есть опция запуска в любом браузере
Запускаем отладку
- Ставим на какую-нибудь инструкцию брэйкпоинт;
- в меню «Run/Debug» выбираем «My Application at Local Apache» — запустится отладка сайта;
- убеждаемся, что выполнение php-скрипта прервалось на брэйкпоинте, и нам доступны все прелести дебагера.
Среда готова к работе.
Заключение
Пользователям MS Visual Studio придется немного привыкнуть к тому, что нажатие кнопки Run при включенном дебагере приводит не к продолжению исполнения текущего скрипта, а к открытию в браузере новой закладки, новому запросу на сервер и отключению отладки, но даже с такими отличиями процесс отладки протекает довольно легко.
Конечно, только удобной среды разработки не достаточно для создания хорошего продукта. Рекомендую почитать habrahabr.ru/post/174963/ — статью, в которой кратко изложены основные грабли, на которые натыкаются разработчики в первых проектах. Если же у вас уже есть успешный опыт разработки крупных проектов на других платформах, старайтесь искать на платформе PHP похожие решения, или приносите свои идеи.
Автор: DarthJurassic