Slide 1

Slide 1 text

Build your own web server with

Slide 2

Slide 2 text

@igorwesome

Slide 3

Slide 3 text

Event-driven, non-blocking I/O with PHP.

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

When you open your web browser… ! What actually happens?

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

http://igor.io/

Slide 8

Slide 8 text

DNS Where is igor.io?

Slide 9

Slide 9 text

DNS 176.58.127.253

Slide 10

Slide 10 text

176.58.127.253

Slide 11

Slide 11 text

2^16! 65535! TCP ports

Slide 12

Slide 12 text

TCP port 80

Slide 13

Slide 13 text

SYN

Slide 14

Slide 14 text

SYN/ACK

Slide 15

Slide 15 text

ACK

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

GET / HTTP/1.1! Host: igor.io

Slide 18

Slide 18 text

HTTP/1.1 200 OK! Content-Type: text/html! ! …

Slide 19

Slide 19 text

HTTP TCP IP

Slide 20

Slide 20 text

Layers +---+--------------+----------------+ | 7 | Application | HTTP, FTP, DNS | | 6 | Presentation | TLS | | 5 | Session | TCP | | 4 | Transport | TCP, UDP | | 3 | Network | IP | | 2 | Data Link | ARP, PPP | | 1 | Physical | | +---+--------------+----------------+

Slide 21

Slide 21 text

http://igor.io/

Slide 22

Slide 22 text

http://igor.io:80/

Slide 23

Slide 23 text

http://igor.io:80/ } DNS (layer 7)! resolves to! IP (layer 3)

Slide 24

Slide 24 text

http://igor.io:80/ } TCP (layer 4)

Slide 25

Slide 25 text

http://igor.io:80/ } TLS (layer 6)! HTTP (layer 7) } HTTP (layer 7)

Slide 26

Slide 26 text

The Socket API

Slide 27

Slide 27 text

________ < socket > -------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||

Slide 28

Slide 28 text

#include #include #include socket() -------- bind() listen() accept() -------- connect()

Slide 29

Slide 29 text

Syscalls Process socket! bind! listen! accept! connect! ! read! write! close! !

Slide 30

Slide 30 text

Stream Sockets

Slide 31

Slide 31 text

I will show you Les Codes 00

Slide 32

Slide 32 text

HTTP: The Protocol

Slide 33

Slide 33 text

Request GET / HTTP/1.1 <--- request line Host: igor.io <--- header <--- line feed <--- body (blank)

Slide 34

Slide 34 text

Response HTTP/1.1 200 OK <--- status line Content-Length: 2 <--- headers <--- line feed Hi <--- body

Slide 35

Slide 35 text

Verbs •GET •POST

Slide 36

Slide 36 text

Verbs •GET •POST •PUT •DELETE

Slide 37

Slide 37 text

Verbs •GET •POST •PUT •DELETE ! •HEAD •OPTIONS •TRACE •CONNECT

Slide 38

Slide 38 text

• 1xx - Special protocol stuff • 2xx - All good • 3xx - Redirection • 4xx - You messed up • 5xx - I messed up Status codes

Slide 39

Slide 39 text

Keep-Alive

Slide 40

Slide 40 text

Streaming • Transfer-Encoding: chunked • dechex(strlen($chunk)) \r\n $chunk \r\n • 0 \r\n \r\n

Slide 41

Slide 41 text

General weirdness • Trailers • Repeated headers • 100 Continue

Slide 42

Slide 42 text

ABNF is very permissive

Slide 43

Slide 43 text

HTTP/1.1 RFC 2616 read it.

Slide 44

Slide 44 text

Parsing

Slide 45

Slide 45 text

Request GET / HTTP/1.1 <--- request line Host: igor.io <--- header <--- line feed <--- body (blank)

Slide 46

Slide 46 text

More codes 01, 02

Slide 47

Slide 47 text

Problem? • Incomplete HTTP parser • Missing error handling • Assumption: request can be read in one go • Assumption: request no larger than 512 bytes • Assumption: request/response body fits in memory • Blocking I/O

Slide 48

Slide 48 text

Non-blocking I/O

Slide 49

Slide 49 text

Even more codes 03-08

Slide 50

Slide 50 text

Unreadable

Slide 51

Slide 51 text

LOL error handling

Slide 52

Slide 52 text

Writing your own HTTP server is hard

Slide 53

Slide 53 text

Don’t do it.

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

Questions? joind.in/9277 ! reactphp.org ! @igorwesome ! ! github.com/igorw/webserver-zceu

Slide 56

Slide 56 text

Bonus • Memory leaks • Too fast reads / too slow writes • libevent / libev / libuv • Promises • Generators • pthreads • WebSockets

Slide 57

Slide 57 text

Logo credits • Netscape • Apache • FreeBSD • Erlang