Язык PHP
Много слышал про
язык PHP, который, в частности, используется для динамического формирования HTML-страниц на веб-сервере в ответ на запросы пользователей. Скрипты на языке PHP пишутся прямо в теле HTML-страниц, а пользователь получает в ответ на свой запрос уже сформированную этими скриптами готовую HTML-страницу. (Сегодня это лишь одно из нескольких применений этого языка, но данный пост касается только способа применения при формировании HTML-страниц.)
Изначально аббревиатура PHP расшифровывалась как «Personal Home Page», так как язык использовался для создания личных интерактивных (для статических HTML-страничек PHP не требуется) HTML-страничек (язык родился в 1995 году). Но с годами применение языка сильно расширилось, поэтому сегодня эта аббревиатура расшифровывается как «PHP: Hypertext Preprocessor».
В интернетах часто пишут про «установку PHP», что может ввести в заблуждение, так как язык программирования - это лишь правила, которые не требуют никакой установки. Фраза про «установку PHP» должна пониматься как «установка интерпретатора PHP», то есть установка программы, которая может интерпретировать (истолковать) скрипт на языке PHP и исполнить его.
Локальный веб-сервер
Самого по себе интерпретатора PHP недостаточно, так как из вышеописанного должно быть понятно, что этот интерпретатор всегда работает в связке с другой программой - веб-сервером. Я устанавливаю PHP для работы локально (в рамках моего компьютера, без выхода в интернет), поэтому мой веб-сервер назовем локальным веб-сервером.
Очень часто при работе с языком PHP используют веб-сервер «Apache» или веб-сервер «Nginx». Мне не хотелось устанавливать на компьютер новые программы, когда в моей операционной системе «Windows 10» уже есть веб-сервер из набора IIS («Internet Information Services»). Набор серверов IIS является частью (компонентой) операционной системы «Windows 10».
В прошлом году я писал про этот веб-сервер пост «
JavaScript: локальный веб-сервер из набора IIS». По умолчанию набор IIS в операционной системе отключен. В указанном посте я описывал, как его включить. Это делается довольно просто и быстро.
Схема работы
Насколько я понимаю, схема работы интерпретатора PHP в связке с веб-сервером выглядит примерно так:
1. Пользователь вводит в адресную строку браузера URL-адрес страницы сайта, написанной на языке PHP, например (обработите внимание на расширение .php страницы сайта):
http://localhost/hello.php 2. Браузер формирует HTTP-запрос и отправляет его на веб-сервер (в моем случае - на локальный веб-сервер, это видно по слову localhost в URL-адресе выше);
3. Веб-сервер (в моем случае - из набора IIS) по URL-адресу определяет, что для обработки такой страницы (с расширением .php) требуется интерпретатор PHP и отправляет текст указанной страницы на обработку интерпретатору PHP;
4. Интерпретатор PHP формирует из кода на языке PHP готовую HTML-страницу и передает ее веб-серверу;
5. Веб-сервер формирует HTTP-ответ с готовой HTML-страницей и отправляет этот ответ браузеру;
6. Браузер получает HTTP-ответ от веб-сервера и отображает полученную HTML-страницу в своем окне. Конец.
Получение интерпретатора PHP
Релизы программы-интерпретора PHP для операционных систем «Windows» можно загрузить со следующего адреса:
https://windows.php.net/download/ Я загрузил оттуда архив в формате ZIP (чуть меньше 30 МБ) с файлами интерпретатора версии 8.1.10 (от 30 августа, самая свежая на сегодня):
https://windows.php.net/downloads/releases/php-8.1.10-nts-Win32-vs16-x64.zip Вообще, по указанной выше ссылке доступно несколько разных вариантов дистрибутива, в том числе два, помеченных аббревиатурами TS (Thread Safe) и NTS (Non Thread Safe). По этому поводу на вышеуказанной странице сказано на английском следующее:
IIS
If you are using PHP as FastCGI with IIS you should use the Non-Thread Safe (NTS) versions of PHP.
TS and NTS
TS refers to multithread capable builds. NTS refers to single thread only builds. Use case for TS binaries involves interaction with a multithreaded SAPI and PHP loaded as a module into a web server. For NTS binaries the widespread use case is interaction with a web server through the FastCGI protocol, utilizing no multithreading (but also for example CLI).
Я выбрал вариант NTS, но не скажу, что четко понимаю, что означают эти аббревиатуры.
Полученные файлы я распаковал из архива и поместил в папку внутри папки «Program Files». В принципе, не имеет значения, где именно размещать на компьютере полученные файлы интерпретатора PHP.
Связываем веб-сервер из набора IIS и интерпретатор PHP
(Все названия пунктов и программ операционной системы «Windows 10» в данном посте даны для варианта операционной системы с интерфейсом на русском языке. В варианте на английском языке эти названия, очевидно, будут на английском языке.)
Локальный веб-сервер из набора IIS у меня уже включен и работает (см. об этом уже упоминавшийся
отдельный пост). Я создал небольшой пробный текстовый файл «hello.php» с кодом на языке HTML и с вкраплением скрипта на языке PHP и поместил в папку своего локального сайта, у меня это такая папка:
C:\inetpub\wwwroot\
Веб-сервер отображает ее в уже знакомый нам URL-адрес:
http://localhost/ Я набрал в браузере URL-адрес
http://localhost/hello.php, но получил в ответ от веб-сервера страницу с ошибкой «404.3». Там было много текста, но, в частности, было сказано: «Если страница является сценарием, добавьте обработчик.». Это логично, ведь веб-сервер пока что не знает, как обрабатывать страницы с расширением «.php». Ему следует дать нужные указания.
Тут следует отметить, что взаимодействие веб-сервера и интерпретатора PHP будет происходить через так называемый интерфейс
CGI (сейчас вместо первоначального CGI используется его более продвинутый потомок
FastCGI). Но когда я включал веб-сервер из набора IIS, я просто нажал галку на установку соответствующей компоненты, а более подробных указаний не дал. При таком раскладе по умолчанию компонента с интерфейсом CGI (FastCGI) отключена (по умолчанию изначально веб-сервер из набора IIS работает только со статическими HTML-страницами). Так что компоненту с интерфейсом CGI (FastCGI) сначала следует включить.
Для этого, как и для первоначального включения набора IIS, откроем диалог «Компоненты Windows». Открываю через поиск «Панель управления», выбираю режим просмотра «Крупные значки», выбираю пункт «Программы и компоненты». В открывшемся окне в меню слева выбираю пункт «Включение или отключение компонентов Windows» - открывается искомый диалог:
Как видно на иллюстрации выше, в разделе «Службы IIS - Службы Интернета - Компоненты разработки приложений» включаем галку с названием «CGI». После этого следует нажать на кнопку «OK» внизу и подождать несколько минут, пока операционная система найдет нужные файлы и включит нужную компоненту.
Теперь наш локальный веб-сервер умеет связываться с другими программами по интерфейсу CGI (FastCGI). Осталось только указать ему, где находится интерпретатор PHP и для обработки каких страниц следует вызывать этот интерпретатор через интерфейс CGI (FastCGI).
Настройку веб-сервера из набора IIS можно производить, как просто редактируя соответствующие конфигурационные файлы, так и используя специальную программу-диспетчер. Я предпочитаю второй вариант. Эту программу можно открыть через поиск операционной системы, набрав название «Диспетчер служб IIS». В окне этой программы в меню «Подключения» слева следует в списке найти и выбрать свой сайт (у меня он определен один и название по умолчанию «Default Web Site» я не стал менять). После этого в меню в центре окна будут показаны пункты настройки для выбранного сайта:
Из меню в центре окна следует выбрать пункт «Сопоставления обработчиков». В меню в центре окна откроется список сопоставлений обработчиков. Из меню «Действия» справа следует выбрать пункт «Добавить сопоставление модуля...» и заполнить открывшийся диалог примерно следующим образом:
Диалог на иллюстрации выше несколько отличается от того, который открывается при первоначальном добавлении сопоставления (это я открыл диалог уже добавленного ранее сопоставления), но это не имеет большого значения: тут видно, какие примерно значения следует вписать в поля. Этим сопоставлением мы показываем веб-серверу, что страницы с расширением «.php» следует передать на обработку исполняемому файлу «php-cgi.exe» интерпретатора PHP (у интерпретатора, кстати, есть целый ряд исполняемых файлов, а именно этот указан в
рекомендациях по установке) через интерфейс, реализуемый модулем «FastCgiModule» (этот модуль, кстати, был бы недоступен, если бы мы не включили ранее компоненту «CGI» операционной системы).
На этом установка интерпретатора PHP и все нужные настройки закончены.
Тестирование
Поместим в пробный файл «hello.php» следующий код на языке HTML с вкраплением скрипта на языке PHP (пробный код я взял из
руководства для начинающих на сайте языка PHP и немного изменил, скрипт на языке PHP выделен синим цветом, после него в коде есть один символ пробела, чтобы в результатном HTML-файле остался символ новой строки в этом месте):
Тест языка PHP
Привет, мир!
'; ?>
Вместо этого файла веб-сервер на URL-адрес
http://localhost/hello.php возвращает браузеру следующий файл с кодом на языке HTML:
Тест языка PHP
Привет, мир!
Браузер отображает в своем окне фразу «Привет, мир!».
(Кстати, обычно для русского языка
в заголовке HTML-страницы следует для кодировки UTF-8 указывать HTML-элемент , чтобы русские буквы отобразились правильно. Но в данном случае я контролирую веб-сервер и поэтому настроил его так, чтобы веб-сервер возвращал правильные HTTP-заголовки с нужным указанием на кодировку HTML-страницы. Поэтому в примере выше указание не понадобилось.)
Еще один тест. Заменим содержимое файла «hello.php» на следующее:
Функция phpinfo сформирует целую HTML-страницу с подробной информацией об используемом интерпретаторе PHP (номере его версии, настройках и так далее), затем веб-сервер вернет ее браузеру на ввод того же URL-адреса, что вводился для первого примера. У меня это получилось.