D AV E Y S H A F I K
• Author of Zend PHP 5 Certification
Study Guide, Sitepoints PHP
Anthology: 101 Essential Tips, Tricks &
Hacks & PHP Master: Write Cutting
Edge Code
• A contributor to Zend Framework 1 &
2, phpdoc, & PHP internals
• Original creator of PHAR/
PHP_Archive
• @dshafik
Slide 3
Slide 3 text
h tt p : / /d e v e l o p e r. a k a m a i .co m
Slide 4
Slide 4 text
Let’s start a conversation about
mental health in tech
mhprompt.org/support
Slide 5
Slide 5 text
H T T P/ 2
A KA : H 2
Slide 6
Slide 6 text
N OT: H T T P/ 2 . 0 O R H T T P 2 . 0
Slide 7
Slide 7 text
W H AT I S H T T P/ 2 ?
CC-BY:
Slide 8
Slide 8 text
R F C 7 5 4 0
H Y P E RT E XT T R A N S F E R P R OTO CO L V E RS I O N 2
Slide 9
Slide 9 text
R F C 7 5 4 1
H PA C K - H E A D E R CO M P R E SS I O N FO R H T T P/ 2
Slide 10
Slide 10 text
–J O H N N Y A P P L E S E E D
CC-BY:
1991 1996 1999
HTTP/0.9
HTTP/1.0
HTTP/1.1
2015
HTTP/2
2009
SPDY
Slide 11
Slide 11 text
B I N A R Y I N ST E A D O F T E XT
CC-BY:
Slide 12
Slide 12 text
F U L LY M U LT I P L E X E D
CC-BY:
I N S T E A D O F O R D E R E D A N D B L O C K I N G
Slide 13
Slide 13 text
C A N US E O N E CO N N E CT I O N
FO R PA R A L L E L R E Q U E STS
CC-BY: Alosh Bennett
Slide 14
Slide 14 text
U S E S H E A D E R CO M P R E SS I O N
CC-BY-SA:
R E D U C E S O V E R H E A D
Slide 15
Slide 15 text
S E R V E R P U S H
I S S U P E R CO O L ( N O R E A L LY )
CC-BY-SA:
Slide 16
Slide 16 text
S E R V E R P U S H
• Allows the server to proactively push assets like stylesheets and
images to the client without them needing to parse the HTML page
and make subsequent requests
• Done by pushing the assets into the client cache, avoiding the
roundtrip necessary to pull them up once the client makes the
request
Slide 17
Slide 17 text
W H AT D O E S H T T P/ 2 M E A N F O R M Y
A P P L I C AT I O N ?
Slide 18
Slide 18 text
T R A N S PA R E N T
CC-BY-SA:
H A N D L E D B Y N G I N X / A PA C H E
Slide 19
Slide 19 text
S O W H AT ’ S T H E P O I N T ?
Slide 20
Slide 20 text
R E M E M B E R T H I S ?
CC-BY:
C A N US E O N E CO N N E CT I O N
FO R PA R A L L E L R E Q U E STS
Slide 21
Slide 21 text
U P LO A D I N G M U LT I P L E I M A G E S
CC-BY:
Slide 22
Slide 22 text
S E R I A L U P LO A D S
! "
$
$
$
$
$
$
Slide 23
Slide 23 text
CO N CU R R E N T
! "
$
$
$
$
$
$
Slide 24
Slide 24 text
M U LT I P L E X E D
! "
$
$
$
$
$
$
Slide 25
Slide 25 text
F E TC H I N G A B LO G P O ST + CO M M E N TS
CC-BY:
Slide 26
Slide 26 text
! "
Slide 27
Slide 27 text
! "
GET /post/1
Slide 28
Slide 28 text
! "
GET /post/1
200 OK application/json
Slide 29
Slide 29 text
{
"type": "post",
"id": "1",
"title": "JSON API paints my bikeshed!",
"tags": ["json", "api", “relationships"],
"author": "http://example.com/posts/1/author",
"comments": "http://example.com/posts/1/comments"
}
M U LT I P L E X E D
! "
GET /post/example/comments/1
GET /post/example/comments/2
GET /post/example/comments/3
GET /post/example/comments/4
Slide 42
Slide 42 text
CSS /J S M I N I F I C AT I O N I S U N E C E SS A R Y
CC-BY:
Slide 43
Slide 43 text
CO D E
Slide 44
Slide 44 text
$numRequests = 378;
Slide 45
Slide 45 text
H T T P/ 1 . 1 : SY N C H R O N O US
$url = 'https://http2.akamai.com/demo/tile-%d.png';
for ($i = 0; $i <= $numRequests; $i++) {
$ch = curl_init();
$conf[CURLOPT_URL] = sprintf($url, $i);
curl_exec($ch);
curl_close($ch);
}
Slide 46
Slide 46 text
4 7 . 6 7
s e co n d s
CC-BY:
Slide 47
Slide 47 text
H T T P/ 2 : SY N C H R O N O US
$url = 'https://http2.akamai.com/demo/tile-%d.png';
for ($i = 0; $i <= $numRequests; $i++) {
$ch = curl_init();
$conf[CURLOPT_URL] = sprintf($url, $i);
curl_setopt($ch, CURLOPT_HTTP_VERSION, HTTP_VERSION_2_0);
curl_exec($ch);
curl_close($ch);
}
Slide 48
Slide 48 text
6 2 . 1 9
s e co n d s
CC-BY-NC:
Slide 49
Slide 49 text
H T T P/ 1 . 1 : CO N CU R R E N T
$mh = curl_multi_init();
$url = 'https://http2.akamai.com/demo/tile-%d.png';
for ($i = 0; $i <= $numRequests; $i++) {
$handles[] = $ch = curl_init();
$conf[CURLOPT_URL] = sprintf($url, ‘%d');
curl_multi_add_handle($mh, $ch);
}
Slide 50
Slide 50 text
H T T P/ 1 . 1 : CO N CU R R E N T ( CO N T. )
do {
$execReturnValue = curl_multi_exec($mh, $runningHandles);
} while ($execReturnValue == CURLM_CALL_MULTI_PERFORM);
while ($runningHandles && $execReturnValue == CURLM_OK) {
$numberReady = curl_multi_select($mh);
if ($numberReady != -1) {
do {
$execReturnValue = curl_multi_exec($mh, $runningHandles);
} while ($execReturnValue == CURLM_CALL_MULTI_PERFORM);
}
}
Slide 51
Slide 51 text
8 . 6 6
s e co n d s
Slide 52
Slide 52 text
H T T P/ 1 . 1 : CO N CU R R E N T
$mh = curl_multi_init();
curl_multi_setopt(
$mh,
CURLMOPT_PIPELINING,
CURLPIPE_MULTIPLEX
);
$url = 'https://http2.akamai.com/demo/tile-%d.png';
for ($i = 0; $i <= $numRequests; $i++) {
$handles[] = $ch = curl_init();
$conf[CURLOPT_URL] = sprintf($url, '%d');
curl_multi_add_handle($mh, $ch);
}
Slide 53
Slide 53 text
H T T P/ 2 : CO N CU R R E N T ( CO N T. )
do {
$execReturnValue = curl_multi_exec($mh, $runningHandles);
} while ($execReturnValue == CURLM_CALL_MULTI_PERFORM);
while ($runningHandles && $execReturnValue == CURLM_OK) {
$numberReady = curl_multi_select($mh);
if ($numberReady != -1) {
do {
$execReturnValue = curl_multi_exec($mh, $runningHandles);
} while ($execReturnValue == CURLM_CALL_MULTI_PERFORM);
}
}
Slide 54
Slide 54 text
2 . 1 4
s e co n d s
CC-BY:
Slide 55
Slide 55 text
S E R V E R P U S H
CC-BY:
Slide 56
Slide 56 text
! "
Slide 57
Slide 57 text
! "
GET /post/1
Slide 58
Slide 58 text
! "
GET /post/1
200 OK application/json
Slide 59
Slide 59 text
GET /post/1/comments
! "
GET /post/1
200 OK application/json
Slide 60
Slide 60 text
GET /post/1/comments
GET /post/1/comment/1
! "
GET /post/1
200 OK application/json
Slide 61
Slide 61 text
! "
GET /post/1/comments
GET /post/1/comment/1
Slide 62
Slide 62 text
! "
GET /post/1/comment/2
GET /post/1/comment/3
GET /post/1/comment/4
GET /post/1/comments
GET /post/1/comment/1
Slide 63
Slide 63 text
! "
GET /post/1/comment/2
GET /post/1/comment/3
GET /post/1/comment/4
GET /post/1/comment/1/author
GET /post/1/comment/2/author
GET /post/1/comment/3/author
GET /post/1/comment/4/author
GET /post/1/comments
GET /post/1/comment/1
Slide 64
Slide 64 text
! "
GET /post/1/comment/2
GET /post/1/comment/3
GET /post/1/comment/4
GET /post/1/comment/1/author
GET /post/1/comment/2/author
GET /post/1/comment/3/author
GET /post/1/comment/4/author
GET /post/1/comment/1/author/avatar.png
GET /post/1/comment/2/author/avatar.png
GET /post/1/comment/3/author/avatar.png
GET /post/1/comment/4/author/avatar.png
GET /post/1/comments
GET /post/1/comment/1
Slide 65
Slide 65 text
G U ZZ L E S U P P O RT
Slide 66
Slide 66 text
G U ZZ L E S U P P O RT
• Some support
• Doesn’t handle lack of http2 support in libcurl
• Doesn’t handle multiplexing
• Untested (but should be OK, as libcurl itself is tested)
• Details: http://daveyshafik.com/guzzle-http2
Slide 67
Slide 67 text
CO D E
CC-BY:
Slide 68
Slide 68 text
H T T P/ 2 : SY N C H R O N O US
use GuzzleHttp\Client;
$url = 'https://http2.akamai.com/demo/tile-
%d.png';
$client = new Client(['version' => 2]);
for ($i = 0; $i <= $numRequests; $i++) {
$client->get(sprintf($url, $i));
}
Slide 69
Slide 69 text
H T T P/ 2 : M U LT I P L E X E D ( P O SS I B L E A P I )
use GuzzleHttp\Client;
$url = 'https://http2.akamai.com/demo/tile-%d.png';
$client = new Client(['version' => 2]);
for ($i = 0; $i <= $numRequests; $i++) {
$promises[] = $client->getAsync(
sprintf($url, $i)
);
}
$results = Promise\unwrap($promises);
Slide 70
Slide 70 text
H T T P/ 2 : M U LT I P L E X E D F I L E U P LO A D
$stack = \GuzzleHttp\HandlerStack::create();
$handler = new \Akamai\NetStorage\Handler
\Authentication();
$handler->setSigner((new \Akamai\NetStorage
\Authentication())->setKey($key, $keyName));
$client = new Akamai\Edgegrid\Open\Client([
'handler' => $stack,
'version' => 2
]);
Slide 71
Slide 71 text
H T T P/ 2 : M U LT I P L E X E D F I L E U P LO A D ( CO N T. )
$url = "http://example.akamaihd.net/cpCode/%s";
foreach ($_FILES as $file) {
$fileName = Ramsey\Uuid\Uuid::uuid4();
$promises = $client->putAsync(
sprintf($url, $filename),
[
'body' => fopen($file['tmp_name'], 'r+')
]
);
}
$results = Promise\unwrap($promises);
Slide 72
Slide 72 text
I N S U M M A R Y
Slide 73
Slide 73 text
H T T P / 2 I S A W E S O M E !
CC-BY-SA:
Slide 74
Slide 74 text
F E E D B A C K & Q U E S T I O N S
Twitter:
Email:
Slides:
@dshafik
[email protected]
http://daveyshafik.com/slides