Как и многие другие языки PHP сразу поставляется со встроенным веб-сервером. Этот веб-сервер создан для удобства разработки, так как не надо ставить ничего дополнительно. Но он не подходит для продакшен-среды. В последнем случае нужно использовать nginx
.
С точки зрения организации кодовой базы разработка сайтов мало отличается от разработки обычных программ. Первым делом необходимо создать директорию, внутри которой будет вестись разработка сайта. Затем ее следует добавить в git-репозиторий. Назовем эту директорию корнем проекта.
Если проект учебный, то лучше сразу создать репозиторий на GitHub и выкладывать все эксперименты туда.
Затем нужно создать файл index.php и поместить его в корень проекта. По соглашению это главный входной файл в PHP, который автоматически ищется веб-серверами.
Создайте такой файл в директории проекта со следующим содержимым:
<?php
// Печатает год в STDOUT
echo date('Y');
echo "\n";
Затем запустите веб-сервер, например, на порту 8080
:
php -S localhost:8080
[Wed May 27 11:55:19 2020]
PHP 7.4.3 Development Server (http://localhost:8080) started
Когда сервер будет запущен, он полностью забирает управление. Вкладка терминала больше не доступна для ввода команд. В отличие от обычных скриптов, которые выполняют свою задачу и заканчиваются, веб-сервера должны слушать порт непрерывно и сразу реагировать на входящие соединения. Поэтому, когда сервер запустят, он продолжит работать, пока его не остановят.
Остановить сервер можно с помощью команды Ctrl-C.
Такой способ запуска удобен в разработке, но в реальном окружении сервера запускают в виде демонов. Это процесс операционной системы, работающий в фоне.
Если в это время попытаться запустить еще один веб-сервер в соседней вкладке на том же порту, то запуск завершится с такой ошибкой:
Failed to listen on localhost:8080 (reason: Address already in use)
Программисты часто встречаются с этой ошибкой. Она означает, что какой-то процесс занял соответствующий порт — в данном случае 8080. В такой ситуации нужно либо остановить процесс, который мешает, либо стартовать на другом порту.
Посмотреть, какой процесс занял порт 8080, можно командой sudo lsof -i :8080
.
После этого откройте браузер и введите http://localhost:8080
. На экран выведется текущий год. В терминале, где запущен веб-сервер, появятся записи (лог), показывающие входящие запросы:
[Wed May 27 14:53:31 2020] [::1]:52988 [200]: GET /
[Wed May 27 14:53:31 2020] [::1]:52990 [404]: GET /favicon.ico - No such file or directory
Теперь снова откройте файл index.php и добавьте ниже вывод echo 'Hello, world!';
. Выполните f5 в браузере, и вы увидите, что изменения применились автоматически. Так происходит, потому что веб-сервер запускает файл на выполнение заново при каждом http-запросе.
Тело HTTP-ответа
При запуске скриптов на PHP, любая функция предсказуемо печатает на экран:
php index.php
2020
Hello, world!
Но если этот же файл запускается веб-сервером, то печать на экран работает по-другому. Всё, что выводится на экран в процессе работы скрипта, веб-сервер собирает и отправляет как тело HTTP-ответа. Это одна из причин популярности PHP.
Фактически вся работа с веб-сервером встроена внутрь языка. Это позволяет быстро начать создавать сайты, не особо разбираясь в том, как этот веб-сервер работает.
Самостоятельная работа
- Повторите все действия из этого урока
- Попробуйте менять вывод внутри index.php и проверять его, нажимая f5 в браузере
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.