HTTP Middlewares in PHP by Eugene Dounar

57
HTTP Middlewares in PHP http://igor.io @igorwhiletrue @eugene_dounar

description

Minsk PHP User Group Meetup #5

Transcript of HTTP Middlewares in PHP by Eugene Dounar

Page 1: HTTP Middlewares in PHP by Eugene Dounar

HTTP Middlewares in PHP

http://igor.io @igorwhiletrue @eugene_dounar

Page 2: HTTP Middlewares in PHP by Eugene Dounar

Interface?

interface A { function doSomething(); function doSomethingElse();}

Page 3: HTTP Middlewares in PHP by Eugene Dounar
Page 4: HTTP Middlewares in PHP by Eugene Dounar
Page 5: HTTP Middlewares in PHP by Eugene Dounar

Универсальный интерфейс

Page 6: HTTP Middlewares in PHP by Eugene Dounar
Page 7: HTTP Middlewares in PHP by Eugene Dounar

find src -name '*.php' | grep -iv tests |

cut -f2- -d/ | cut -f1 -d\. |

awk '{ print length, $0 }' | sort -n |

tr / \\ ;

Page 8: HTTP Middlewares in PHP by Eugene Dounar
Page 9: HTTP Middlewares in PHP by Eugene Dounar

nc

Page 10: HTTP Middlewares in PHP by Eugene Dounar
Page 11: HTTP Middlewares in PHP by Eugene Dounar
Page 12: HTTP Middlewares in PHP by Eugene Dounar

xinetd

Page 13: HTTP Middlewares in PHP by Eugene Dounar
Page 14: HTTP Middlewares in PHP by Eugene Dounar

cgi

Page 15: HTTP Middlewares in PHP by Eugene Dounar

RFC 3875

The Common Gateway Interface (CGI) [22] allows an HTTP [1], [4] server and a CGI script to share responsibility for responding to client requests.

Page 16: HTTP Middlewares in PHP by Eugene Dounar

scriptПеременные окружения

ENV

Заголовки

Тело ответа

Page 17: HTTP Middlewares in PHP by Eugene Dounar

GET / HTTP/1.1Host: igor.ioAccept: */*

REQUEST_METHOD = GETPATH_INFO = /HTTP_HOST = igor.ioHTTP_ACCEPT = */*SERVER_NAME = igor.io

Page 18: HTTP Middlewares in PHP by Eugene Dounar

Content-Type: text/html

<!DOCTYPE html><html>...</html>

Page 19: HTTP Middlewares in PHP by Eugene Dounar

fcgi

Page 20: HTTP Middlewares in PHP by Eugene Dounar

nginx

script

Page 21: HTTP Middlewares in PHP by Eugene Dounar

Python?

WSGI

Page 22: HTTP Middlewares in PHP by Eugene Dounar

def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) yield 'Hello World\n'

Page 23: HTTP Middlewares in PHP by Eugene Dounar

Ruby?

Page 24: HTTP Middlewares in PHP by Eugene Dounar

app = lambda do |env| body = "Hello, World!" [200, { "Content-Type" => "text/plain", "Content-Length" => body.length.to_s }, [body]]end run app

Page 25: HTTP Middlewares in PHP by Eugene Dounar

PHP?

?

Page 26: HTTP Middlewares in PHP by Eugene Dounar

PHP?

sapi

Page 27: HTTP Middlewares in PHP by Eugene Dounar

$_SERVERheader()echoexit()

Page 28: HTTP Middlewares in PHP by Eugene Dounar

php_sapi_name()

➔ aolserver➔ apache➔ apache2filter➔ apache2handler➔ caudium➔ cgi (until PHP

5.3)➔ cgi-fcgi➔ cli➔ continuity➔ embed

➔ isapi➔ litespeed➔ milter➔ nsapi➔ phttpd➔ pi3web➔ roxen➔ thttpd➔ tux➔ webjame

s

Page 29: HTTP Middlewares in PHP by Eugene Dounar

Python :)Ruby :)PHP :(

Page 30: HTTP Middlewares in PHP by Eugene Dounar

HttpKernelInterface

Page 31: HTTP Middlewares in PHP by Eugene Dounar

<?php

namespace Symfony\Component\HttpKernel;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;interface HttpKernelInterface{ const MASTER_REQUEST = 1; const SUB_REQUEST = 2;

public function handle( Request $request, $type = self::MASTER_REQUEST, $catch = true );}

Page 32: HTTP Middlewares in PHP by Eugene Dounar

<?php

namespace Symfony\Component\HttpKernel;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;interface HttpKernelInterface{ const MASTER_REQUEST = 1; const SUB_REQUEST = 2;

public function handle( Request $request, $type = self::MASTER_REQUEST, $catch = true );}

Page 33: HTTP Middlewares in PHP by Eugene Dounar

kernel

sapi

Page 34: HTTP Middlewares in PHP by Eugene Dounar

Why?

Обернуть древний код для тестов?

Page 35: HTTP Middlewares in PHP by Eugene Dounar

Why?

Обернуть древний код для тестов?

exit(‘you lose’);

Page 36: HTTP Middlewares in PHP by Eugene Dounar

CgiHttpKernel

Адаптер CGI реализующий интерфейс HttpKernelInterface

Page 37: HTTP Middlewares in PHP by Eugene Dounar

Why?

Кэширование?

Page 38: HTTP Middlewares in PHP by Eugene Dounar

Why?

Кэширование?

$kernel = new AppCache($kernel);

Page 39: HTTP Middlewares in PHP by Eugene Dounar

Why?

Кэширование?

varnish

$kernel = new AppCache($kernel);

Page 40: HTTP Middlewares in PHP by Eugene Dounar

middleware

Page 41: HTTP Middlewares in PHP by Eugene Dounar

<?php$app = new CallableHttpKernel(function ($request) { return new Response('Hello World!');});

Page 42: HTTP Middlewares in PHP by Eugene Dounar

class Logger implements HttpKernelInterface{ private $app; private $logger; public function __construct(HttpKernelInterface $app, LoggerInterface $logger) { $this->app = $app; $this->logger = $logger; }

public function handle(Request $request, ...) { $response = $this->app->handle($request, $type, $catch); $this->log($request, $response);

return $response; }

private function log(Request $request, Response $response) { ... }}

Page 43: HTTP Middlewares in PHP by Eugene Dounar

$app = new Logger( $app, new Monolog\Logger());

Page 44: HTTP Middlewares in PHP by Eugene Dounar

Session

Authentication

Logger

App

Page 45: HTTP Middlewares in PHP by Eugene Dounar

Rack middlewares https://github.com/rack/rack/wiki/List-of-Middleware

WSGI middlewares http://wsgi.readthedocs.org/en/latest/libraries.html

HttpKernel middlewares ?

Page 46: HTTP Middlewares in PHP by Eugene Dounar

Идея: Выполнять код до и после

обработки каждого запроса

Page 47: HTTP Middlewares in PHP by Eugene Dounar

class Foo implements HttpKernelInterface{ private $app;

public function __construct(HttpKernelInterface $app) { $this->app = $app; }

public function handle(Request $request, ...) { $response = $this->app->handle($request, $type, $catch); return $response; }}

Page 48: HTTP Middlewares in PHP by Eugene Dounar

Идея: Выполнять код до и после

обработки каждого запроса

События?

Page 49: HTTP Middlewares in PHP by Eugene Dounar

$blog = new Silex\Application();$blog->get('/', function () { return 'This is the blog!';});$app = new Stack\UrlMap($app, [ '/blog' => $blog,]);

UrlMap

Page 50: HTTP Middlewares in PHP by Eugene Dounar

$app = new CallableHttpKernel(function ($request) { $session = $request->getSession(); ...});$app = new Stack\Session($app);

Session

Page 51: HTTP Middlewares in PHP by Eugene Dounar

$app = new Igorw\Stack\OAuth($app, [ 'key'=> 'foo', 'secret'=> 'bar', 'callback_url' => 'http://localhost:8080/auth/verify', 'success_url'=> '/', 'failure_url'=> '/auth',]);$app = new Stack\Session($app);

OAuth

Page 52: HTTP Middlewares in PHP by Eugene Dounar

$request->attributes->get('oauth.token');

Page 53: HTTP Middlewares in PHP by Eugene Dounar

Простая композиция:

Page 54: HTTP Middlewares in PHP by Eugene Dounar

$stack = (new Stack\Builder()) ->push('Stack\Session') ->push('Igorw\Stack\OAuth', [...]) ->push('Foo');$app = $stack->resolve($app);

Page 55: HTTP Middlewares in PHP by Eugene Dounar

Middlewares!

● HttpCache● GeoIp● Backstage● Basic Authentication● CORS● Firewall

● CookieGuard● IpRestrict● OAuth● Hawk● StackRobots

Page 56: HTTP Middlewares in PHP by Eugene Dounar

More?● Authentication (~Warden)● ForceSSL● Debug toolbar● ESI● OpenID● ...

Page 57: HTTP Middlewares in PHP by Eugene Dounar

stackphp.com

github.com/stackphp

@stackphp

“HttpKernel is a lie” by @igorwhiletrue