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

10 комментариев
PHP-сервер для аскетов

Начиная с версии 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-приложения.

Горячие события

Конкурс EY Entrepreneur Of The Year 2020
31 мая — 31 мая

Конкурс EY Entrepreneur Of The Year 2020

GoWayFest 4.0
11 июля — 11 июля

GoWayFest 4.0

Минск

Читайте также

Состоялся релиз PHP 7.4
Состоялся релиз PHP 7.4

Состоялся релиз PHP 7.4

Уязвимость PHP7 подвергает сайты риску удалённого взлома
Уязвимость PHP7 подвергает сайты риску удалённого взлома

Уязвимость PHP7 подвергает сайты риску удалённого взлома

3 комментария
7 языков программирования, которые стоит изучать в 2019 году
7 языков программирования, которые стоит изучать в 2019 году

7 языков программирования, которые стоит изучать в 2019 году

5 комментариев
Google выпустила Android Studio 3.3 с акцентом на «улучшения и качество»
Google выпустила Android Studio 3.3 с акцентом на «улучшения и качество»

Google выпустила Android Studio 3.3 с акцентом на «улучшения и качество»

Обсуждение

0

Для кого этот текст? Ну совсем детский сад, и так нашего брата не любят, зачем давать повод лишний раз поржать с нас?

0

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

0

Смеяться могут и будут именно с php-разработчиков.

0

Тогда нужно внести небольшую ясность. Профессиональные PHP-разработчики, вероятно, и сами лучше знают, как организовать свою рабочую среду, и эта заметка им будет мало интересна. Тогда они пройдут мимо неё и обратят внимание на другие статьи, благо есть выбор. Но IT-отрасль не состоит исключительно из PHP-разработчиков, иначе, как я понимаю, и смеяться было бы некому.

Есть ещё разработчики настольных и мобильных приложений, программисты контроллеров, есть даже совсем не разработчики, а менеджеры и системные администраторы. Возможно, кто-то из них хотел бы посмотреть, что за дела происходят в web-разработке, проверить какую-нибудь идею, наконец, сделать свой сайт. Разбираться с настройками Apache или NGINX у этих людей может не быть ни времени, ни желания.Они могут, конечно, использовать перечисленные в заметке сборки для web-разработки. Но ведь можно ограничиться установкой только PHP. Речь в заметке идёт о последнем случае.

Плюс, может быть, кто-нибудь из профессионалов подскажет, как добиться нормальной работы с кодировками страниц, отдаваемых встроенным в php web-сервером?

0

Поиск по запросу новичка приведет его на практически аналогичную статью на Хабре. 2012 года.

meta charset + header – никаких проблем не вызывало. С другой стороны, я адепт utf-8, так что могу не знать подводных камней при работе с другими кодировками.

0

Если Вы о статье http://habrahabr.ru/post/155853/ (ссылка на неё присутствует в этой заметке), то в ней речь идёт о настройке php-сервера под Linux. И кроме того, что там тоже речь идёт о php-сервере, общих моментов я не заметил.

1

http://php.net/manual/ru/features.commandline.webserver.php

Пример #3 Использование скрипта маршрутизации

- устанавливаете кодировку
- отдаете файл средствами php readfile / echo file_get_contents

но использование windows-1251 это жесть.
то же касается того чтобы добавлять через реестр команду в контексное меню
чтобы быстро проверять изменение пути скрипта.
писать надо сразу используя относительные пути или константы __FILE__ __DIR__
или значения сервера DOCUMENT_ROOT SCRIPT_NAME

0

Спасибо за наводку. У меня получился такой сценарий маршрутизации:

array ('text/html', 'windows-1251'),
'js' => array ('text/javascript', 'windows-1251')
);
$p = strrpos ($uri, '.');
if ($p !== FALSE):
$ext = strtolower (substr ($uri, $p + 1));
if (array_key_exists ($ext, $exts)):
list ($ct, $enc) = $exts[$ext];
header ("Content-type: $ct; charset=$enc");
unset ($uri, $exts, $p, $ext, $ct, $enc);
@readfile (substr ($_SERVER["REQUEST_URI"], 1));
else:
unset ($uri, $exts, $p, $ext, $ct, $enc);
return FALSE;
endif;
else:
unset ($uri, $exts, $p, $ext, $ct, $enc);
return FALSE;
endif;
?>

Если его записать в папку c PHP-инсталляцией под именем C:\PHP5\router.php, то командную строку в REG-файле можно подкорректировать так: php.exe -S 127.0.0.1:8080 C:\PHP5\router.php, и тогда HTML-файлы и подключаемый JavaScript отдаётся в заданной кодировке.

0

Мои глаза...

0

бррр...винда