Php что это в строительстве

Содержание

Аббревиатура PHP, расшифровывается как «PHP: Hypertext Preprocessor» (PHP: Препроцессор Гипертекста). PHP — это интерпретируемый язык программирования общего назначения, работающий на серверной стороне. Это означает, что когда посетитель запрашивает страницу сайта, сервер получает запрос, передаёт управление интерпретатору PHP, он выполняет все необходимые операции, отдаёт готовый код серверу и только потом сервер отправляет готовую страницу браузеру. Обычно PHP-файлы помимо самого PHP-кода содержат ещё HTML, CSS и возможно JavaScript.

PHP хоть и является языком общего назначения, но изначально он создавался специально для web-разработки. Основным преимуществом PHP является возможность добавлять PHP-код непосредственно в обычные HTML документы.

Пример встраивания PHP-кода в HTML-документ:

Возможности

  • Если вам необходимо динамическое формирование содержимого страницы, PHP будет отличным решением для этого.
  • С помощью PHP можно устанавливать и читать cookies, управлять аутентификацией и авторизацией, использовать сессии.
  • Он может взаимодействовать с различными базами данных на основе пользовательских данных.
  • С помощью PHP можно легко сделать форму обратной связи, отправлять почту, добавить возможность оставлять комментарии и многое другое.

Необходимые инструменты

Для тех, кто решил начать изучать PHP мы рекомендуем установить сборку XAMPP. Она содержит всё необходимое для работы с PHP.

Что такое PHP?

После установки XAMPP, запустите его и нажмите Start напротив Apache . Далее введите в адресной строке браузера localhost , чтобы убедиться, что сервер находится в активном состоянии. Он должен отображать файл index.php , расположенный по умолчанию по адресу C:xampphtdocsindex.php на компьютерах с операционной системой Windows. htdocs — папка, в которой веб-сервер Apache будет искать файлы для отображения. Всё что в этой папке содержится после установки XAMPP можно смело удалять и добавлять туда только ваши файлы.

С этой темой смотрят:

Источник: puzzleweb.ru

Зачем изучать PHP: рейтинг, перспективы, сферы применения

Зачем изучать PHP: рейтинг, перспективы, сферы применения главное изображение

В этой статье поговорим о PHP. Узнаем о перспективах и популярности этого языка в 2021 году, рассмотрим сферу применения, уровень зарплат и другие вопросы. Комментарии известных специалистов помогут развеять сомнения о целесообразности изучения PHP.

Краткая теория: что такое PHP и где он применяется

PHP (от англ. Hypertext Preprocessor) — язык программирования, который изначально создавался для разработки веб-приложений, но эволюционировал в язык общего назначения.

Справка: иногда русскоязычные специалисты произносят название так: «пхп». Конечно, это не совсем верно. Но такое произношение и написание закрепилось в профессиональном жаргоне. Поэтому не удивляйтесь, если услышите фразу «язык программирования пхп».

PHP входит в число языков с динамической типизацией. Это значит, что тип данных определяется не при объявлении переменной, а при присваивании значения. Подробнее о типизации можно узнать в курсе «Введение в программирование».

PHP — интерпретируемый язык. Написанные на нём программы интерпретируются в момент обращения с помощью специальных программ. Интерпретируемые языки не зависят от платформы, но уступают компилируемым языкам в скорости исполнения. Дополнительную информацию об интерпретируемых и компилируемых языках смотрите в курсе «Введение в программирование», ссылка выше.

Область применения PHP

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

Справка: сначала аббревиатура PHP обозначала Personal Home Page. Это отражает основное назначение языка — создание веб-страниц.

На PHP написаны популярные системы управления контентом (CMS), например, WordPress, Joomla!, Drupal. На одном только WordPress’е работает около трети от всех сайтов в интернете. Это подтверждает актуальность и популярность PHP. На этом языке написаны и популярные фреймворки для создания сайтов, например, Laravel, Yii2, Symfony. Наконец, такие масштабные и популярные проекты, как Facebook и «ВКонтакте», тоже созданы на PHP.

Промежуточный итог: PHP — интерпретируемый язык с динамической типизацией. Применяется преимущественно для разработки веб-приложений. На этом языке написаны популярные движки для сайтов и фреймворки.

Популярность и рейтинг PHP

Популярность и востребованность языка прямо влияет на перспективы трудоустройства специалиста. Чтобы оценить популярность PHP, воспользуйтесь специализированными рейтингами, изучите количество вакансий в своём городе или регионе.

По результатам мая 2021 года PHP входит в десятку самых популярных языков программирования в индексе TIOBE. Этот язык занимает девятое место, опережая Swift, Ruby, Objective-C, Go.

Справка: индекс TIOBE рассчитывается по количеству поисковых запросов с названием языка. То есть он отражает интерес пользователей интернета к конкретным языкам программирования.

В ежегодном отчёте GitHub есть рейтинг популярности языков программирования. PHP занимает в нём шестое место. По частоте использования на GitHub этот язык уступает только JavaScript, Java и Python, TypeScript и C#.

Справка: рейтинг GitHub Octoverse учитывает частоту применения языков пользователями GitHub. То есть он отражает востребованность конкретного языка в сообществе разработчиков.

Если вы живете и планируете работать в регионах, а не в Москве или в Санкт-Петербурге, при оценке популярности PHP учитывайте следующий момент. В регионах именно PHP — простой и быстрый способ влиться в разработку. Этот язык массово используют региональные веб-студии, которые делают сайты на заказ. Подробнее об этом смотрите в видео Кирилла Мокевнина.

Что будет с популярностью PHP в краткосрочной и долгосрочной перспективе

Достоверного ответа на этот вопрос не знает никто, поэтому придется довольствоваться предположениями и рассуждениями. В качестве гарантии востребованности этого языка можно рассматривать то, что на нём работает львиная доля сайтов.

Смотрите сами: по данным W3Tech, в начале июня 2021 года 64,9% всех сайтов в мире работают на платформе WordPress. При этом в августе 2020 года этот показатель составлял 63,5%, а в августе 2019 года — 61%, то есть популярность WordPress, который работает на PHP, растёт. Доля Joomla! и Drupal составляет 3,9% и 2,6%, соответственно. Эти CMS тоже написаны на PHP.

Важно: суммарная рыночная доля трёх указанных движков составляет 70%. К ней можно прибавить менее популярные CMS, написанные на PHP, а также сайты на фреймворках, например, Laravel или Yii2.

Системы управления контентом развиваются, работающие на них сайты массово не закроются. Поэтому востребованность PHP в обозримой перспективе будет высокой.

Промежуточный вывод: PHP входит в число самых востребованных языков программирования. Большая часть популярных CMS написана на этом языке. В регионах PHP — один из языков, которые обеспечивают быстрый вход в разработку.

Зарплата PHP-программиста: сколько платят

Уровень заработка PHP-разработчика зависит от региона, квалификации специалиста, режима трудоустройства (удалёнка или офис, штат или фриланс) и других факторов. Поэтому для определения уровня зарплат в вашем регионе придётся изучать информацию самостоятельно.

Например, по данным компании NewHR, в середине 2020 года средняя зарплата PHP-программиста уровня middle в Москве составила 150–190 тыс. рублей. Senior’ы зарабатывают в среднем 180–240 тыс. рублей. Зарплата ведущего программиста составляет от 240 тыс. рублей.

Самостоятельно изучить рынок труда в своём регионе можно с помощью специализированных карьерных сайтов. Например, по запросу «PHP-программист» на hh.ru в июне 2021 года есть около 2870 вакансий с зарплатной вилкой от 40 тыс. рублей до 305 тыс. рублей.

Читайте также:  Россельхозбанк документы на кредит по строительству

Промежуточный итог: уровень заработка PHP-разработчика зависит от ряда факторов, включая регион, квалификацию специалиста и форму занятости. Достоверную информацию по своему региону можно получить на сайтах по трудоустройству, а также во время реальных собеседований.

Сложно ли изучать PHP

Объективного ответа на этот вопрос нет, так как сложность относится к субъективным понятиям. Тем не менее PHP имеет репутацию языка с низким порогом вхождения. В данном случае речь идёт как об особенностях самого языка, так и о доступности информации: в интернете очень много литературы, платных и бесплатных курсов и упражнений по PHP. Подробнее об этом смотрите ниже в комментариях экспертов.

Важно отметить следующий момент. Новичкам стоит начинать обучение не с изучения языка, а с изучения программирования. Подробнее о важности этого тезиса рассказывается в нашем бесплатном курсе «Введение в программирование».

Тезис по итогам раздела: PHP имеет репутацию языка с низким порогом вхождения. Но новичкам надо сразу фокусироваться на изучении программирования, а не синтаксиса языков.

Начните изучать PHP на Хекслете бесплатно Первые курсы в профессии «PHP-программист» можно пройти бесплатно. Зарегистрируйтесь и начните учиться.

Перспективы PHP: мнения экспертов

Мы попросили известных в PHP-сообществе специалистов поделиться своими взглядами на перспективы языка и актуальность его изучения. Эксперты отвечали на следующие вопросы:

  • По вашему опыту, почему стоит изучать PHP?
  • Какие перспективы у этого языка программирования по сравнению с другими языками?
  • Будет ли он востребован в будущем?
  • Каковы перспективы PHP-разработчика на рынке труда?
  • Почему новичку стоит обратить внимание на этот язык?

С ответами можно ознакомиться ниже.

Евгений Пуха: перспективы у PHP интересные

Евгений Пуха

PHP – довольно хороший вариант для изучения как для новичков в сфере IT, так и для тех, кто работает с другими языками. Синтаксис языка входит в группу C-подобных, а это даёт возможность быстрее понять логику в коде приложений на Java, C#, C++ и так далее. Те же Python и Golang выглядят непривычно, но для тех, кто хочет изучить больше языков — это не преграда.

Если говорить о плюсах PHP, на котором мы делаем большинство проектов, стоит отнести:

  • низкий порог вхождения;
  • удобные и проверенные инструменты разработки;
  • огромное сообщество;
  • не менее огромное количество инструкций, готовых решений (CMS, фреймворки, плагины и библиотеки);
  • нетребовательность к рабочему окружению.

С точки зрения новичка этот язык хорош ещё и тем, что использует динамическую типизацию и модель «отработал и умер». Это делает менее острой проблему утечек памяти и позволяет писать меньше строк кода, делая универсальные методы и функции, хоть в некоторых случаях и в ущерб архитектуре.

Перспективы у PHP также довольно интересные. С версии 5.3 язык начал очень активно развиваться и приобретать выразительные свойства (пространства имён, примеси, генераторы, опциональный тайп-хинтинг и другое), возможность работы в асинхронном режиме, а в будущих версиях ожидается JIT, FFI, поддержка предзагрузки, полноценная асинхронность.

Перспективы в трудоустройстве также довольно обширны. Достаточно много как старых проектов, так и только разрабатываемых, используют PHP. При этом сложность приложений также варьируется: начиная от небольших посадочных страниц и заканчивая сложными веб-приложениями, обрабатывающими большие объёмы данных внутри кластеров серверов.

Евгений Пуха, руководитель отдела PHP-разработки AGIMA.

Дмитрий Елисеев: PHP делает всего одну работу, но делает её идеально

Дмитрий Елисеев

Если рассматривать все языки с их разделением по областям применения, то есть языки общего назначения, на которых пишут софт разного типа, и есть специализированные, на которых чаще пишут что-то одно.

PHP в этом плане сильно специализированный, так как используется только для разработки сайтов. В такой специализации есть как плюс, так и минус.

Минус в том, что PHP приспособлен только к стандартному для него синхронному однопоточному выполнению в рамках веб-сервера, а остальное пока не очень умеет. Так что как только требуется сделать что-то для него нестандартное, то возникает необходимость эмулировать эти вещи или делать остальные части на других языках вроде серверного JavaScript для асинхронности или Go для многопоточности.

А плюс в том, что хоть он и делает всего одну работу, но делает её идеально. Разработчики самого языка не отвлекаются на посторонние задачи и совершенствуют его только в основном направлении, оптимизируя скорость и привнося только важные для него новшества из других языков. Поэтому в нише скриптовых интерпретируемых веб-языков PHP практически является самым быстрым. Быстрее него уже только языки компилируемые, но будущий PHP 8.0 с JIT-компиляцией, как нам обещает его разработчик Дмитрий Стогов в докладе, вскоре обгонит и их.

К тому же это язык с синтаксисом из семейства более продвинутых Java и C#, что позволяет PHP-программистам учиться у них и при необходимости легко перейти на любой язык этой группы. С Ruby или Python со своим обособленным синтаксисом это будет сделать проблематично.

В PHP переходят хорошие практики из других языков. Создаются и развиваются профессиональные фреймворки. Так что из языка для любительских сайтов он уверенно переходит в нишу быстрых профессиональных веб-проектов, авторам которых не хочется поднимать тяжелые серверы на Java. Учить PHP сейчас или нет?

Каждый раз накатывает новая волна технологий и каждый раз снова и снова «хоронят» PHP фразами, что вот-вот очередные Ruby или NodeJS победят PHP. Но десятки лет проходят, а всё никто его не побеждает.

Помимо продвинутого программирования веб-приложений на фреймворках, PHP отличается наличием большого числа CMS для разработки стандартных сайтов. И они никуда исчезать не собираются. Для экзотических задач удобны экзотические языки. А для классических проектов успешно хватает классического PHP.

Так что всегда можно сказать, что другие языки приходят и уходят, а PHP, С++ и Java скорее всего вечны. И работы на них всегда будет много.

Дмитрий Елисеев, предприниматель, автор проектов elisdn.ru и deworker.pro.

Александр Сербул: в веб-разработке у PHP нет достойной альтернативы

Александр Сербул

Я занимаюсь разработкой с нулевых годов. В работе использую преимущественно PHP, также пользуюсь JavaScript, Java, Python и другими языками. Могу сказать, что PHP очень специфичный язык. Он создан специально для веб-разработки, для решения конкретных задач в вебе. PHP решает связанные с веб-разработкой задачи максимально быстро, здесь не нужны тяжеловесные инструменты, как в других языках.

Когда-то PHP был очень простым и достаточно медленным языком. Затем он стал развиваться в сторону Java в плане синтаксиса и поддержки объектно-ориентированного программирования (ООП). Появилось движение в сторону сильной типизации. Разработчики стали понимать, что для больших серьёзных проектов слабая типизация — недостаток.

В плане перспектив языка нужно понимать ситуацию. PHP заточен под веб, а в вебе он конкурирует, например, с JavaScript и Python. Из-за этого есть тенденция снижения зарплат PHP-программистов. Но это временное явление.

Во фронтенд-разработке не хватает квалифицированных специалистов. Из-за этого общий уровень разработчиков на JavaScript недостаточно высокий. Да и сам язык JavaScript кошмарный с моей точки зрения. Это тоже давит на PHP-сообщество, в том числе на уровень зарплат.

Но тенденция, как я говорил, временная. PHP не умрёт, так как у него нет альтернатив в веб-разработке. Тот же Python не заточен под веб так, как заточен PHP.

Если говорить о перспективах, язык будет развиваться. В PHP появится сильная типизация, будет развиваться ООП. Так что у языка хорошие перспективы.

Александр Сербул, руководитель направления контроля качества интеграции и внедрений в 1С-Битрикс.

Стоит ли учить PHP: заключение

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

Читайте также:  Строительство жилья это сфера

По словам экспертов, язык развивается в сторону ООП, в нем ожидается появление сильной типизации. Это упростит работу над серьёзными масштабными проектами. Поэтому разработчиков на PHP ждут интересные задачи. На Хекслете изучать PHP можно в рамках профессии. Азы можно изучать на нашем бесплатном ресурсе Code Basics.

Источник: ru.hexlet.io

Современный PHP без фреймворков

У меня есть для вас непростое задание. Когда в следующий раз начнёте новый проект, постарайтесь обойтись без PHP-фреймворка. Я не собираюсь перечислять недостатки фреймворков, и это не проявление синдрома неприятия чужой разработки: в этом руководстве мы будем использовать пакеты, написанные разработчиками нескольких фреймворков. Я всецело уважаю инновации в этой сфере.

Но эта статья не о них. Она о вас. О возможности стать лучше как разработчик.

Возможно, главным плюсом отказа от фреймворка станет знание, как всё работает под капотом. Вы будете видеть, что происходит, не полагаясь на фреймворк, который заботится о вас настолько, что вы не можете что-то отладить или до конца понять.

Возможно, ваша следующая работа не позволит вам насладиться запуском нового проекта без фреймворка. Многие важные, критические для бизнеса PHP-задачи подразумевают использование уже существующих приложений. И неважно, будет это приложение, построенное на современном фреймворке вроде Laravel или Symfony, на одной из старых платформ вроде CodeIgniter или FuelPHP — либо это удручающе широко распространённое легаси PHP-приложение с «include-oriented архитектурой»: если сейчас вы будете разрабатывать без фреймворка, то окажетесь лучше подготовлены к любому будущему PHP-проекту.

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

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

Как работает PHP?

Прежде всего важно понять, как PHP-приложения взаимодействуют с внешним миром.

PHP исполняет серверные приложения в цикле запрос/ответ. Всё взаимодействие с приложением — из браузера, командной строки или REST API — приходит в него в качестве запросов. При получении запроса приложение загружается, обрабатывает запрос и генерирует ответ, который передаётся обратно клиенту, а приложение закрывается. И так происходит при каждом обращении.

Контроллер запросов

Вооружившись этим знанием, начнём с фронт-контроллера. Он представляет собой PHP-файл, обрабатывающий все запросы к вашему приложению. То есть это первый PHP-файл, в который попадает запрос, и (по сути) последний PHP-файл, через который проходит ответ приложения.

Давайте воспользуемся классическим примером с Hello, world!, обслуживаемым встроенным в PHP веб-сервером, чтобы проверить, всё ли настроено корректно. Если вы этого ещё не сделали, то удостоверьтесь, что в среде установлен PHP 7.1 или выше.

Создадим директорию проекта, в ней сделаем вложенную директорию public , а внутри неё — файл index.php с таким кодом:

Обратите внимание, здесь мы объявляем строгую типизацию — это нужно делать в начале каждого PHP-файла вашего приложения, — потому что подсказки типов (type hinting) важны для отладки и ясного понимания теми, кто будет заниматься кодом после вас.

Далее с помощью инструмента командной строки (вроде Terminal на MacOS) перейдём в директорию проекта и запустим встроенный в PHP веб-сервер.

Теперь откроем в браузере адрес http://localhost:8080/. Отображается Hello, world! без ошибок?

Отлично. Переходим к следующему шагу!

Автозагрузка и сторонние пакеты

Когда вы впервые начали работать с PHP, то, вероятно, использовали выражения include или require для получения функциональности или конфигураций из других PHP-файлов. В целом этого лучше избегать, потому что другим людям потом будет гораздо труднее разобраться в коде и понять, где находятся зависимости. Это превращает отладку в кошмар.

Выход — автозагрузка. Это означает, что, когда вашему приложению нужно использовать какой-то класс, PHP знает, где его найти, и автоматически загружает в момент вызова. Эта возможность существует со времён PHP 5, но стала активно применяться только с появлением PSR-0 (стандарта автозагрузки, сегодня заменён PSR-4).

Можно было бы пройти через тягомотину написания собственного автозагрузчика, но раз мы выбрали Composer для управления сторонними зависимостями, а в нём уже есть очень удобный автозагрузчик, то его мы и будем использовать.

Проверьте, что у вас установлен Composer. Затем настройте его для своего проекта.

После этого пройдите через интерактивное руководство по генерированию конфигурационного файла composer.json . Затем откройте его в редакторе и добавьте поле autoload , чтобы получилось так, как показано ниже (тогда автозагрузчик будет знать, где искать ваши классы).

Теперь установите для этого проекта Composer, которые подтянет все зависимости (если они уже есть) и настроит для нас автозагрузчик.

Обновите public/index.php для запуска автозагрузчика. В идеале это одно из нескольких выражений include, которые вы используете в приложении.

Если перезагрузить приложение в браузере, вы не увидите никакой разницы. Однако автозагрузчик работает, просто он не делает ничего тяжёлого. Давайте перенесём пример с Hello, world! в автоматически загружаемый класс, чтобы проверить, как всё работает.

В корне проекта создадим папку src и вставим в неё файл HelloWorld.php с таким кодом:

Теперь в public/index.php замените выражение echo вызовом метода announce в классе HelloWorld .

Перезагрузите приложение в браузере и увидите новое сообщение!

Что такое внедрение зависимостей?

Внедрение зависимостей — это методика, при которой каждая зависимость предоставляется объекту, которому она требуется, вместо того чтобы объект обращался наружу за получением какой-то информации или функциональности.

Допустим, методу класса нужно считать из базы данных. Для этого надо к ней подключиться. Обычно новое подключение создаётся с учётными данными, полученными из глобального пространства.

Но это не лучшее решение. На чуждый метод возлагается ответственность за создание объекта нового подключения к БД, получения учётных данных и обработки любых проблем в случае сбоя подключения. В результате в приложении дублируется масса кода. А если вы попытаетесь прогнать этот класс через модульное тестирование, то не сможете. Класс тесно взаимосвязан со средой приложения и базой данных.

Давайте с самого начала не будем усложнять работу с тем, что требуется классу. Просто в первую очередь потребуем, чтобы объект PDO был внедрён в класс.

Получилось гораздо чище и проще для понимания, меньше вероятность ошибок. Благодаря подсказке типов и внедрению зависимостей метод объявляет именно то, что ему нужно для выполнения задачи, и получает необходимое без вызова из себя внешней зависимости. А когда речь пойдёт о модульном тестировании, мы окажемся готовы к моделированию подключения к БД и спокойно пройдём тест.

Контейнер внедрения зависимости — это инструмент, в который вы обёртываете всё ваше приложение ради создания и внедрения этих самых зависимостей. Контейнер не является необходимым, но значительно облегчает жизнь по мере роста и усложнения вашего приложения.

Мы воспользуемся самым популярным DI-контейнером для PHP с изобретательным названием PHP-DI. (Надо отметить, что в его документации внедрение зависимостей описано иначе, и кому-то так будет понятнее.)

Контейнер внедрения зависимостей

Поскольку мы настроили Composer, установка PHP-DI пройдёт практически безболезненно. Для этого снова обратимся к командной строке:

Обновите public/index.php для конфигурирования и сборки контейнера.

Читайте также:  Расчет потребления воды при строительстве

Ничего особенного пока не произошло. Это лишь простой пример, где всё необходимое помещено в один файл для удобства наблюдения.

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

Заметка на полях: автоматическое внедрение зависимостей может быть полезной фичей в начале создания приложения, но в дальнейшем оно усложняет сопровождение, поскольку зависимости остаются относительно скрытыми. К тому же возможно, что через несколько лет другой разработчик подключит какую-нибудь библиотеку, и в результате несколько библиотек будут реализовывать один интерфейс. Это сломает автоматическое внедрение зависимостей и приведёт к непредсказуемому потоку багов. Разработчик, внёсший изменение, может их вообще не заметить.

Давайте ещё больше всё упростим, импортировав пространства имён там, где это возможно.

Пока что выглядит всё так, словно мы устроили суматоху ради выполнения того, что уже делали раньше.

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

Middleware

Если представить приложение в виде луковицы, в которой запросы идут снаружи к центру, а ответы в обратном направлении, то middleware — это каждый слой луковицы, который получает запросы, вероятно, что-то делает с ответами и передаёт их в нижний слой либо генерирует ответ и отправляет в верхний слой. Такое случается, если промежуточный слой проверяет запросы на соответствие каким-то условиям вроде запроса несуществующего пути.

Если запрос проходит до конца, приложение обработает его и превратит в ответ. После этого каждый промежуточный слой в обратном порядке будет получать ответ, возможно, модифицировать его и передавать следующему слою.

Варианты использования промежуточных слоев:

  • Отладка проблем при разработке.
  • Постепенная обработка исключений в production.
  • Ограничение частоты входящих запросов.
  • Ответы на запросы неподдерживаемых медиатипов.
  • Обработка CORS.
  • Маршрутизация запросов в соответствующие обрабатывающие классы.

Промежуточный слой — это единственный способ реализации инструментов для обработки всех этих ситуаций? Вовсе нет. Но реализации middleware позволяют сделать цикл запрос/ответ гораздо понятнее, что сильно упростит отладку и ускорит разработку.

Мы воспользуемся промежуточным слоем для последнего сценария: маршрутизации.

Маршрутизация

Маршрутизатор применяет информацию из запроса, чтобы понять, какой класс должен его обработать (например, URI /products/purple-dress/medium должен быть обработан с помощью класса ProductDetails::class с передаваемыми в качестве аргументов purple-dress и medium ).

Наше приложение будет использовать популярный маршрутизатор FastRoute через реализацию промежуточного слоя, совместимого с PSR-15.

Диспетчер middleware

Чтобы наше приложение стало работать с каким-либо промежуточным слоем, нам понадобится диспетчер.

PSR-15 — это стандарт, определяющий интерфейсы для middleware и диспетчеров (в спецификации они называются «обработчики запросов»), обеспечивающий взаимосовместимость широкого спектра решений. Нам лишь нужно выбрать диспетчер, совместимый с PSR-15, и он будет работать с любым совместимым middleware.

В качестве диспетчера установим Relay.

А поскольку спецификация PSR-15 подразумевает, чтобы реализация промежуточного слоя передавала HTTP-сообщения, совместимые с PSR-7, мы воспользуемся Zend Diactoros.

Подготовим Relay к приёму промежуточных слоев.

В строке 16 мы с помощью ServerRequestFactory::fromGlobals() будем собирать всю информацию, необходимую для создания нового запроса и передачи его Relay . Здесь запрос попадает в стек промежуточных слоев.

Теперь добавим FastRoute и обработчика запросов ( FastRoute определяет, валиден ли запрос и может ли он быть обработан нашим приложением, а обработчик запросов передаёт запрос тому обработчику, что сконфигурирован для этого маршрута).

А теперь определим маршрут для класса обработчика Hello, world. Здесь мы воспользуемся маршрутом /hello , чтобы продемонстрировать возможность использования маршрута, отличающегося от базового URI.

Чтобы всё заработало, нужно обновить HelloWorld , сделав его вызываемым классом, то есть чтобы этот класс можно было вызвать как функцию.

Обратите внимание на добавленный exit; в магическом методе __invoke() . Скоро вы поймёте, к чему это.

Теперь откройте http://localhost:8080/hello и наслаждайтесь своим успехом!

Клей, который всё скрепляет вместе

Проницательный читатель заметит, что DI-контейнер, несмотря на все трудности его конфигурирования и сборки, на самом деле ничего не делает. Диспетчер и промежуточное ПО могут работать и без контейнера.

Так зачем он нужен?

А что, если — как это почти всегда бывает в реальных приложениях — у класса HelloWorld есть зависимость?

Давайте её добавим и посмотрим, что произойдёт.

Перезагрузим браузер, и.

Это происходит потому, что для функционирования HelloWorld требуется при его создании внедрить строковое значение, а у нас это повисло в воздухе. И здесь на помощь приходит контейнер.

Давайте определим зависимость в контейнере и передадим его в RequestHandler для разрешения.

Вуаля! При перезагрузке браузера вы должны увидеть Hello, bar world!.

Правильная отправка ответов

Помните, я упомянул о выражении exit в HelloWorld ?

Это простой способ удостовериться, что мы получили простой ответ, но всё же это не лучший способ отправки выходных данных в браузер. Такой грубый подход заставляет HelloWorld делать лишнюю работу по отдаче отчетов — а этим должен заниматься другой класс, — что слишком усложняет отправку заголовков и кодов статуса, а также приводит к закрытию приложения, не давая шансов запуститься промежуточному ПО, идущему после HelloWorld .

Помните, что каждый промежуточный слой имеет возможность модифицировать запрос по пути в приложение, а также (в обратном порядке) модифицировать ответ по пути из приложения. В дополнение к стандартному интерфейсу для Request PSR-7 определяет структуру ещё одного HTTP-сообщения, которое будет нам полезно на обратной ветке цикла: Response . Если хотите, можете почитать подробнее о HTTP-сообщениях и о том, чем хороши стандарты PSR-7 Request и Response.

Обновим HelloWorld для возвращения Response .

Обновим определение контейнера, чтоб HelloWorld предоставлялся со свежим объектом Response .

Если мы сейчас обновим страницу, то получим пустой экран. Приложение возвращает из диспетчера промежуточных слоев правильный объект Response , а потом… что?

Просто ничего с ним не делает.

Нам нужен ещё один инструмент: эмиттер. Он находится между приложением и веб-сервером (Apache, nginx и т. д.) и отправляет ваш ответ клиенту, сгенерировавшему запрос. Эмиттер просто берёт объект Response и преобразует в инструкции, доступные для понимания серверным API.

Хорошие новости! Пакет Zend Diactoros , который мы уже используем для управления запросами, включает в себя эмиттер для ответов PSR-7.

Для простоты примера мы используем здесь очень простой эмиттер. Хотя он может быть гораздо сложнее, но в случае больших загрузок реальное приложение должно быть сконфигурировано для автоматического использования потокового эмиттера. Это хорошо описано в блоге Zend.

Обновим public/index.php для получения Response от диспетчера и передачи в эмиттер.

Перезагрузим страницу — мы снова в деле! Пришло время для более надёжной обработки ответов.

В строке 15 заканчивается цикл запрос/ответ и вступает в работу веб-сервер.

Завершение

С помощью 44 строк кода и нескольких широко используемых, тщательно протестированных, надёжных, взаимодействующих друг с другом компонентов мы реализовали программу bootstrap современного PHP-приложения. Он совместим со стандартами PSR-4, PSR-7, PSR-11 и PSR-15, поэтому вам доступен широкий спектр реализаций HTTP-сообщений, DI-контейнеров, middleware и диспетчеров.

Мы углубились в некоторые технологии и аргументацию, но я надеюсь, вам очевидна простота программы начальной загрузки нового приложения без сопутствующего хлама фреймворка. Также надеюсь, что вы теперь лучше готовы к применению этих технологий в существующих приложениях.

Использованное в статье приложение лежит в репозитории, можете свободно форкать и скачивать.

Если воспользуетесь этим кодом в production , то, вероятно, вам понадобится вынести маршруты и определения контейнера в отдельные файлы, чтобы легче было сопровождать их по мере усложнения проекта. Также рекомендую реализовать EmitterStack для «умной» обработки скачиваний файлов и прочих больших ответов.

Источник: habr.com

Рейтинг
Загрузка ...