Промежуточное программное обеспечение - это общий термин для программного обеспечения, которое служит для «клейкого смещения» отдельных, часто сложных и уже существующих программ. Некоторые программные компоненты, которые часто связаны с промежуточным программным обеспечением, включают корпоративные приложения и веб -службы.
ref:
* http://searchsoa.techtarget.com/definition/middleware
* http://www.webopedia.com/TERM/M/middleware.html
* http://www.softwareag.com/blog/reality_check/index.php/integration-insights/middleware-for-my-mom-or-kids-guide-to-what-i-do/
* http://www.networkcomputing.com/netdesign/cdmwdef.htm
* https://en.wikipedia.org/wiki/Middleware
Что такое промежуточное программное обеспечение?
Промежуточное программное обеспечение - это код, который существует между запросом и ответом, который может принять входящий запрос, выполнять действия на основе его и либо завершить ответ, либо передавать делегирование на следующее промежуточное программное обеспечение в очереди.
https://github.com/zendframework/zend-tratigility/blob/master/doc/book/middleware.md
Промежуточное программное обеспечение HTTP предоставляет удобный механизм для фильтрации HTTP -запросов, введенных в вашу заявку. Например, Laravel включает промежуточное программное обеспечение, которое проверяет пользователь вашего приложения. Если пользователь не будет аутентифицирован, промежуточное программное обеспечение перенаправляет пользователя на экран входа в систему. Однако, если пользователь аутентифицирован, промежуточное программное обеспечение позволит запросу продолжить дальнейшее приложение.
http://laravel.com/docs/master/middleware
Silex позволяет запустить код, который меняет поведение Silex по умолчанию на разных этапах во время обработки запроса через Middlewares:
http://silex.sensiolabs.org/doc/middlewares.html
Цель промежуточного программного обеспечения состоит в том, чтобы осмотреть, анализировать или изменять среду приложения, запрос и ответ до и/или после того, как вызывается тонкое приложение.
http://docs.slimframework.com/middleware/overview/
Все сообщения HTTP состоят из используемой версии протокола HTTP, заголовков и корпуса сообщений. Запрос основан на сообщении, чтобы включить метод HTTP, используемый для выполнения запроса, и URI, для которого выполняется запрос. Ответ включает в себя код статуса HTTP и фразу разума.
...
Будь вы программист или нет, вы видели его везде в Интернете. В этот момент в адресной строке браузеров показывается что -то, что начинается с "http: //". Даже ваш первый сценарий Hello World отправил HTTP -заголовки, не осознавая этого. В этой статье мы собираемся узнать о основах заголовков HTTP и о том, как мы можем использовать их в наших веб -приложениях.
Ответ HTTP, который сервер отправляет обратно клиенту, содержит заголовки, которые идентифицируют тип контента в теле ответа, сервер, который отправил ответ, сколько байтов находится в теле, когда ответ был отправлен и т. Д. PHP и Apache обычно заботятся о вас, идентифицируя документ как HTML , рассчитывающий длину страницы HTML и так на. Большинству веб -приложений никогда не нужно устанавливать заголовки сами. Однако, если вы хотите отправить обратно что -то, что не является HTML, установите время истечения для страницы, перенаправить браузер клиента или создать определенную ошибку HTTP, вам нужно использовать функцию header ().
*How to See HTTP Headers*
* Firebug extensions to analyze HTTP headers.
1. Turn in Firebug
2. Click Net
3. Click Headers
Ref:
* http://docstore.mik.ua/orelly/webprog/php/ch07_05.htm
* http://code.tutsplus.com/tutorials/http-headers-for-dummies--net-8039
*Headers already sent: Why does it happen?*
To understand why headers must be sent before output it's necessary to look at a typical HTTP response. PHP scripts mainly generate HTML content, but also pass a set of HTTP/CGI headers to the webserver:
HTTP/1.1 200 OK
Powered-By: PHP/5.3.7
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8
<html><head><title>PHP page output page</title></head>
<body><h1>Content</h1> <p>Some more output follows...</p>
and <a href="/"> <img src=internal-icon-delayed> </a>
The page/output always follows the headers. PHP has to pass the headers to the webserver first. It can only do that once. After the double linebreak it can nevermore amend them.
When PHP receives the first output (print, echo, <html>) it will flush all collected headers. Afterwards it can send all the output it wants. But sending further HTTP headers is impossible then.
PHP не имеет встроенной поддержки для HTTP-сообщений.
...
Потоки PHP являются наиболее удобным и вездесущим способом отправки HTTP -запросов, но создают ряд ограничений в отношении правильной настройки поддержки SSL и обеспечения громоздкого интерфейса вокруг установления таких вещей, как заголовки. Curl предоставляет полный и расширенный набор функций, но, поскольку он не является расширением по умолчанию, часто отсутствует. Расширение HTTP страдает от той же проблемы, что и Curl, а также тот факт, что оно традиционно имело гораздо меньше примеров использования.
Большинство современных клиентских библиотек HTTP, как правило, абстрагируют реализацию, чтобы гарантировать, что они могут работать над любой средой, в которой они выполняются, и на любом из вышеуказанных слоев.
Примечания:
cURL allows you to connect and communicate to many different types of servers with many different types of protocols.
(http://php.net/manual/en/intro.curl.php)
PHP использует API Server (SAPI) для интерпретации входящих HTTP -запросов, ввода маршала и передачи обработки сценариям. Оригинальный дизайн SAPI отражал общий интерфейс шлюза, который будет марша, запрашивая данные и подтолкнули его в переменные среды, прежде чем передавать делегирование в сценарий; Затем сценарий будет извлекать из переменных среды, чтобы обработать запрос и вернуть ответ.
PHP SAPI Design Abstracts общие источники ввода, такие как файлы cookie, аргументы строк запросов и контент, кодируемый URL, через SuperGlobals ($ _cookie, $ _get и $ _post, соответственно), предоставляя уровень удобства для веб-разработчиков.
...
Прямое использование суперглобалов имеет ряд проблем. Во -первых, они изменяются, что позволяет библиотекам и коду изменять значения и, таким образом, изменять состояние для приложения. Кроме того, суперглобалы затрудняют тестирование подразделения и интеграции трудными и хрупкими, что приводит к деградации качества кода.
...
Наконец, когда дело доходит до ответов на стороне сервера, PHP получает по-своему: любой контент, испускаемый до вызова header (), приведет к тому, что этот вызов станет без операции; В зависимости от настроек отчетности об ошибках это часто может означать, что заголовки и/или состояние ответа не отправляются правильно. Один из способов обойти это - использовать функции буферизации выходных путей PHP, но гнездование буферов выходных данных может стать проблематичным и трудным для отладки. Таким образом, фреймворки и приложения имеют тенденцию создавать абстракции ответов для агрегирования заголовков и контента, которые могут быть излучены одновременно - и эти абстракции часто несовместимы.
Ref: http://www.php-fig.org/psr/psr-7/meta/
Вы можете использовать переменные суперглобалов (как $ _get и $ _post), но они являются глобальным изменчивым состоянием. Наряду с этим блоком и интеграционным тестированием вашего кода становится трудным.
По этим причинам многие фреймворки PHP решили реализовать воздержание для представления HTTP -сообщений (см., Например, Symfony HTTPFoundation или Zend HTTP).
Это привело к ситуации, когда любое приложение было основано на конкретной реализации HTTP -сообщений, так что оно вряд ли можно было использовать в проектах, созданных с использованием других структур.
Вот почему общий набор интерфейсов помогает абстрагировать HTTP -сообщения и работать с ними в рамках агностического способа.
Ref: http://stackoverflow.com/questions/32805681/php-why-http-message-implementations
HTTP используется для передачи ресурсов, а не только файлов. Ресурс - это какая -то часть информации, которая может быть идентифицирована с помощью URL (это R в URL). Наиболее распространенным видом ресурса является файл, но ресурс также может быть динамически сгенерированным результатом запроса, выводом сценария CGI, документ, который доступен на нескольких языках или что-то еще.
Ref:
* http://www.w3schools.com/tags/ref_httpmessages.asp
* https://www.jmarshall.com/easy/http/