PHP-сервер для аскетов

14 мая 2015, 12:09

Начиная с версии 5.4 PHP содержит встроенный web-сервер, который можно использовать на этапе разработки и тестирования web-приложений. Как упростить запуск этого сервера в контексте нужного проекта?

Читать далее

Иллюстрация: webblog360.com

Наиболее правильный способ заниматься web-разработкой на PHP — установить (возможно, в виртуальной машине) Linux с web-сервером, PHP-транслятором и сервером базы данных. Если же и настройка всех компонентов соответствует «продуктовому» серверу (только с расширенными предупреждениями и сообщениями об ошибках), то лучше и придумать ничего нельзя. Отлаженные в такой среде модули будут ожидаемо вести себя в реальной жизни.

Тем не менее, продолжают развиваться проекты для быстрого развёртывания среды разработки под управлением Windows: «Денвер», «EasyPHP» и другие сборки. Они содержат настроенный инструментарий и достаточно успешно моделируют среду работы сайта.

Но состав таких комбайнов может показаться излишне роскошным, если нужно отладить небольшой сценарий. Большую часть работы можно выполнить, используя лишь PHP-интерпретатор в режиме командной строки. Однако для моделирования информационного обмена по протоколу HTTP, обработки форм и тестирования AJAX без web-сервера не обойтись.

В этих случаях можно воспользоваться web-сервером, который встроен в php.exe, начиная с версии 5.4. О его возможностях, конфигурировании и способах применения написано уже немало. Поэтому в этой заметке я хочу остановиться на вопросах создания с его помощью минималистичной, но комфортной среды PHP-разработчика под Windows.

Предполагается, что для запуска сервера нужно открыть окно командной строки, перейти в папку с файлами web-проекта и выполнить команду:

C:PHP5php.exe -S 127.0.0.1:8080

Где 127.0.0.1 — IP-адрес интерфейса, который будет «прослушиваться» web-сервером, а 8080 — номер порта, на котором будут приниматься HTTP-запросы.

Вот, в общем-то, и всё. Открываем браузер, вводим в адресной строке «http://localhost:8080/» и, если в папке с проектом имеется файл index.php или index.html, можем наблюдать в окне браузера результат его работы.

Результат обработки простого PHP-сценария встроенным web-сервером.

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

Чтобы такую возможность реализовать, лучше всего добавить путь к папке с программой php.exe к значению переменной окружения PATH, а в системный реестр Windows внести следующую информацию:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOTDirectoryBackgroundshellphpsrv]

@="PHP server"

"NoWorkingDirectory"=""

"Extended"=""

[HKEY_CLASSES_ROOTDirectoryBackgroundshellphpsrvcommand]

@="cmd.exe /s /c "cd /D "%V" && php.exe -S 127.0.0.1:8080""

[HKEY_CLASSES_ROOTDirectoryshellphpsrv]

@="PHP server"

"NoWorkingDirectory"=""

"Extended"=""

[HKEY_CLASSES_ROOTDirectoryshellphpsrvcommand]

@="cmd.exe /s /c "cd /D "%V" && php.exe -S 127.0.0.1:8080""

 

После выполнения этих изменений достаточно щёлкнуть над папкой с проектом правой кнопкой мыши, удерживая при этом клавишу <Shift>, и выбрать в контекстном меню новый пункт «PHP server». Если по каким-то причинам удерживать клавишу не хочется, из приведенного выше REG-файла нужно исключить строки «Extended"="». Теперь главное не забывать завершать с помощью комбинации клавиш <Ctrl+C> работу одного сервера перед тем, как стартовать другой.

Запуск встроенного web-сервера из контекстного меню.

А сейчас уместно упомянуть о ложке дёгтя. Для меня таковой стал сумбур, который вносит сервер в ту часть поля HTTP-ответа «Content-type», которая декларирует кодировку отдаваемых данных. До тех пор, пока обрабатываются PHP-файлы, сервер действует корректно: вписывает значение «charset» либо по команде header (), либо из параметра конфигурационного файла «default_charset».

Но если обработке подлежит html-файл или подключается внешний файл с javascript-сценарием, то для них применяется значение кодировки UTF-8, независимо от наличия или отсутствия параметра в конфигурационном файле. Если действительно нужно работать с UNICODE-файлами, этот эффект останется незамеченным. В противном случае он может доставить массу неприятных минут.

При обработке файла index.php кодировка страницы выставляется правильно.

При подключении JavaScript-сценария выставляется кодировка UTF-8.

Например, в моём случае сценарий PHP генерировал HTML-страничку, которая использовала подкючаемый JavaScript, модифицирующий в свою очередь текстовые свойства объектов DOM. Понадобилось некоторое время, чтобы разобраться, почему отдаваемый в кодировке Windows-1251 (по данным перехвата протокола HTTP) HTML-файл содержит «ромбовопросы» в некоторых блоках странички.

Через PHP-процессор пропускаются только файлы с расширением .php, остальные отдаются «как есть». Поэтому исправить ситуацию путём добавления в HTML-файл PHP-блока для корректировки HTTP-заголовка не представляется возможным.

Раз уж не удалось избежать вопроса о конфигурировании сервера, скажем о нём ещё несколько слов. Лучше всего за основу взять идущий в дистрибутивном пакете файл «php.ini-development» и создать его копию с именем «php.ini». В появившемся таким образом файле нужно произвести следующие изменения:

1) Указать путь к папке с расширениями PHP:

extension_dir = "C:/PHP5/EXT"

и включить необходимые расширения, убрав признак комментария (символ «точка с запятой») перед необходимыми модулями в блоке «Dynamic Extensions». Например, для использования функций обработки многобайтных строк нужно подключить модуль «php_mbstring.dll».

2) Указать адрес отправителя писем:

sendmail_from = admin@localhost.localdomain

и часовой пояс:

date.timezone = "Europe/Minsk"

для того, чтобы не выдавались предупреждения при использовании функции mail ().

В заключение можно отметить, что web-сервер, встроенный в php.exe, в подавляющем большинстве случаев позволяет заменить любой другой Web-серевер на этапе разработки php-приложения.

Обсуждение