Slide 1

Slide 1 text

` ASYNC FUN WITH REACTPHP A talk by / Cees-Jan Kiewiet @WyriHaximus

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

CEES-JAN KIEWIET / @WYRIHAXIMUS Twitter.com/WyriHaximus Github.com/WyriHaximus PHP developer for way to long Enjoying asynchronous programming

Slide 4

Slide 4 text

A LITTLE BIT ABOUT REACTPHP

Slide 5

Slide 5 text

REACTPHP ISN'T MAGIC https://twitter.com/Anahkiasen/status/454248836999831552

Slide 6

Slide 6 text

THE REACTPHP CORE: THE EVENT LOOP File descriptor polling One off timers Periodic timers Deferred execution of callbacks

Slide 7

Slide 7 text

THE REACTPHP COMPONENTS react/cache react/child-process react/dns react/event-loop react/http react/http-client react/socket react/socket-client react/stream

Slide 8

Slide 8 text

OUR JOURNEY STARTS WITH RATCHET w y r i m a p s @ w o r k e r 1 : ~ # p h p r a t c h e t . p h p

Slide 9

Slide 9 text

WAMP Abstraction layer ontop the Websocket Protocol PubSub RPC

Slide 10

Slide 10 text

FIRST THINGS FIRST: THE EVENT LOOP $ l o o p = \ R e a c t \ E v e n t L o o p \ F a c t o r y : : c r e a t e ( ) ; There can be only one per process!

Slide 11

Slide 11 text

SETTING UP RATCHET THE SIMPLE WAY $ a p p = n e w R a t c h e t \ A p p ( ' w y r i m a p s . n e t ' , 8 0 0 1 , ' 0 . 0 . 0 . 0 ' , $ l o o p ) ; $ a p p - > r o u t e ( ' / w s ' , n e w W y r i m a p s N e t ( $ l o o p ) ; $ a p p - > r u n ( ) ;

Slide 12

Slide 12 text

SETTING UP RATCHET THE ADVANCED WAY $ s o c k e t = n e w R e a c t o r ( $ l o o p ) ; $ s o c k e t - > l i s t e n ( 8 0 0 1 , ' 0 . 0 . 0 . 0 ' ) ; $ i o S e r v e r = n e w I o S e r v e r ( n e w H t t p S e r v e r ( n e w W s S e r v e r ( n e w S e s s i o n P r o v i d e r ( n e w W a m p S e r v e r ( n e w C a k e W a m p A p p S e r v e r ( . . . ) ) , n e w C a k e W a m p S e s s i o n H a n d l e r ( ) , [ ] , n e w P h p S e r i a l i z e H a n d l e r ( ) ) ) ) , $ s o c k e t , $ l o o p ) ;

Slide 13

Slide 13 text

THE EVENTLOOP'S STATE

Slide 14

Slide 14 text

WE USE PHUNINNODE TO MONITOR RATCHET w y r i m a p s @ w o r k e r 1 : ~ # p h p p h u n i n N o d e . p h p

Slide 15

Slide 15 text

A DIFFERENT PROCESS ANOTHER EVENT LOOP $ l o o p = \ R e a c t \ E v e n t L o o p \ F a c t o r y : : c r e a t e ( ) ;

Slide 16

Slide 16 text

SOCKET SERVER $ s o c k e t = n e w \ R e a c t \ S o c k e t \ S e r v e r ( $ l o o p ) ; $ s o c k e t - > l i s t e n ( 1 2 3 4 5 , ' 0 . 0 . 0 . 0 ' ) ;

Slide 17

Slide 17 text

SETTING UP PHUNINNODE $ n o d e = n e w \ W y r i H a x i m u s \ P h u n i n N o d e \ N o d e ( $ l o o p , $ s o c k e t ) ; $ n o d e - > a d d P l u g i n ( n e w \ W y r i H a x i m u s \ P h u n i n N o d e \ P l u g i n s \ P l u g i n s ( ) ) ; $ n o d e - > a d d P l u g i n ( n e w \ W y r i H a x i m u s \ P h u n i n N o d e \ P l u g i n s \ P l u g i n s C a t e g o r i e s ( ) ) ; $ n o d e - > a d d P l u g i n ( n e w \ W y r i H a x i m u s \ P h u n i n N o d e \ P l u g i n s \ M e m o r y U s a g e ( ) ) ; $ n o d e - > a d d P l u g i n ( n e w \ W y r i H a x i m u s \ P h u n i n N o d e \ P l u g i n s \ U p t i m e ( ) ) ;

Slide 18

Slide 18 text

START THE LOOP $ l o o p - > r u n ( ) ;

Slide 19

Slide 19 text

THE EVENTLOOP'S STATE

Slide 20

Slide 20 text

THE USER INTERFACE

Slide 21

Slide 21 text

THE SEARCH BOX

Slide 22

Slide 22 text

FRONTEND TECH Build on Autobahn Fallback on websocket.js (Flash)

Slide 23

Slide 23 text

OVERVIEW

Slide 24

Slide 24 text

LETS FOLLOW A USER ACTION

Slide 25

Slide 25 text

USER OPENS PAGE

Slide 26

Slide 26 text

PUNCH IN SEARCH QUERY

Slide 27

Slide 27 text

EVENT LOOP STATE

Slide 28

Slide 28 text

RATCHET RECEIVES AND ROUTES RPC CALL c l a s s C a k e W a m p A p p S e r v e r i m p l e m e n t s R a t c h e t \ W a m p \ W a m p S e r v e r I n t e r f a c e { p u b l i c f u n c t i o n o n C a l l ( C o n n $ c o n n , $ i d , $ t o p i c , a r r a y $ p a r a m s ) { / / C a l l t h e r e s p o n s i b l e e v e n t l i s t e n e r } }

Slide 29

Slide 29 text

PROMISES $ d e f e r r e d = n e w \ R e a c t \ P r o m i s e \ D e f e r r e d ( ) ; $ d e f e r r e d - > p r o m i s e ( ) - > t h e n ( f u n c t i o n ( $ r e s u l t s ) u s e ( $ c o n n , $ i d ) { $ c o n n - > c a l l R e s u l t ( $ i d , $ r e s u l t s ) ; } , f u n c t i o n ( $ e r r o r U r i , $ d e s c = ' ' , $ d e t a i l s = n u l l ) u s e ( $ c o n n ) { $ c o n n - > c a l l E r r o r ( $ i d , $ e r r o r U r i , $ d e s c , $ d e t a i l s ) ; } ) ;

Slide 30

Slide 30 text

FIRE THE EVENT $ t h i s - > d i s p a t c h E v e n t ( ' R a c h e t . W a m p S e r v e r . R p c . ' . $ t o p i c N a m e , [ ' p r o m i s e ' = > $ d e f e r r e d , ' t o p i c ' = > $ t o p i c , ' p a r a m s ' = > $ p a r a m s , ' w a m p S e r v e r ' = > $ t h i s , ] ) ) ;

Slide 31

Slide 31 text

HTTPCLIENT PREREQUISITES $ d n s R e s o l v e r F a c t o r y = n e w \ R e a c t \ D n s \ R e s o l v e r \ F a c t o r y ( ) ; $ d n s R e s o l v e r = $ d n s R e s o l v e r F a c t o r y - > c r e a t e C a c h e d ( ' 8 . 8 . 8 . 8 ' , $ l o o p ) ;

Slide 32

Slide 32 text

PREPARING THE HTTPCLIENT $ f a c t o r y = n e w \ R e a c t \ H t t p C l i e n t \ F a c t o r y ( ) ; $ c l i e n t = $ f a c t o r y - > c r e a t e ( $ l o o p , $ d n s R e s o l v e r ) ;

Slide 33

Slide 33 text

QUERYING ELASTICSEARCH $ r e q u e s t = $ c l i e n t - > r e q u e s t ( ' G E T ' , ' U R L ' , [ / * H e a d e r s * / ] ) ; $ r e q u e s t - > o n ( ' h e a d e r s - w r i t t e n ' , f u n c t i o n ( $ t h a t ) u s e ( $ s e a r c h ) { $ t h a t - > w r i t e ( ' J S O N q u e r y b o d y ' ) ; } ) ; $ r e q u e s t - > o n ( ' r e s p o n s e ' , f u n c t i o n ( $ r e s p o n s e ) { $ r e s p o n s e - > o n ( ' d a t a ' , f u n c t i o n ( $ d a t a ) { / / . . . } ) ; } ) ; $ r e q u e s t - > e n d ( ) ;

Slide 34

Slide 34 text

EVENT LOOP STATE

Slide 35

Slide 35 text

EVENT LOOP STATE

Slide 36

Slide 36 text

FULFILLING THE PROMISE $ r e q u e s t - > o n ( ' e n d ' , f u n c t i o n ( ) u s e ( $ p r o m i s e , & $ b u f f e r ) { $ p r o m i s e - > r e s o l v e ( $ b u f f e r ) ; } ) ;

Slide 37

Slide 37 text

SENDING THE RESULT BACK TO THE CLIENT f u n c t i o n ( $ r e s u l t s ) u s e ( $ c o n n , $ i d ) { $ c o n n - > c a l l R e s u l t ( $ i d , $ r e s u l t s ) ; }

Slide 38

Slide 38 text

EVENT LOOP STATE

Slide 39

Slide 39 text

THE RESULT FOR THE USER

Slide 40

Slide 40 text

OVERVIEW

Slide 41

Slide 41 text

STATISTICS

Slide 42

Slide 42 text

A WILD MUNIN CONNECTION APEARS

Slide 43

Slide 43 text

ACCEPTING THE CONNECTION $ s o c k e t - > o n ( ' c o n n e c t i o n ' , f u n c t i o n ( C o n n e c t i o n $ c o n n ) { } ) ;

Slide 44

Slide 44 text

MUNIN SENDS A COMMAND

Slide 45

Slide 45 text

HANDLING INCOMING DATA $ b u f f e r = ' ' ; $ c o n n - > o n ( ' d a t a ' , f u n c t i o n ( $ d a t a , $ c o n n ) u s e ( & $ b u f f e r ) { $ b u f f e r . = $ d a t a ; i f ( s t r p o s ( $ b u f f e r , P H P _ E O L ) ! = = f a l s e ) { / / Y a y l e t s l o o k s o m e t h i n g u p } } ) ;

Slide 46

Slide 46 text

REQUESTING STATISTICS FROM RATCHET

Slide 47

Slide 47 text

CONTACTING RATCHET OVER 0MQ $ z m q = n e w Z M Q C o n t e x t ( 1 ) ; $ s e r v e r C o n n e c t i o n = $ z m q - > g e t S o c k e t ( Z M Q : : S O C K E T _ R E Q ) ; $ s e r v e r C o n n e c t i o n - > c o n n e c t ( ' t c p : / / 1 2 7 . 0 . 0 . 1 : 5 5 5 5 / ' ) ; $ s e r v e r C o n n e c t i o n - > s e n d ( s e r i a l i z e ( $ c o m m a n d ) ) ;

Slide 48

Slide 48 text

RATCHET ACCEPTS THE CONNECTION

Slide 49

Slide 49 text

ON THE RATCHET SIDE $ c o n t e x t = n e w \ R e a c t \ Z M Q \ C o n t e x t ( $ l o o p ) ; $ s o c k e t = $ c o n t e x t - > g e t S o c k e t ( Z M Q : : S O C K E T _ R E P ) ; $ s o c k e t - > b i n d ( ' t c p : / / 1 2 7 . 0 . 0 . 1 : 5 5 5 5 / ' ) ; $ s o c k e t - > o n ( ' m e s s a g e ' , f u n c t i o n ( $ m e s s a g e ) u s e ( $ e v e n t , $ s o c k e t ) { $ c o m m a n d = u n s e r i a l i z e ( $ m e s s a g e ) ; $ s o c k e t - > s e n d ( s e r i a l i z e ( $ c o m m a n d - > e x e c u t e ( $ e v e n t - > s u b j e c t ( ) ) ) ) ; } ) ;

Slide 50

Slide 50 text

RATCHET RESPONDS

Slide 51

Slide 51 text

BACK AT PHUNINNODE $ c o m m a n d - > r e s p o n s e ( u n s e r i a l i z e ( $ s e r v e r C o n n e c t i o n - > r e c v ( ) ) ) ;

Slide 52

Slide 52 text

RECEIVING THE DATA

Slide 53

Slide 53 text

PASSING DATA BACK TO MUNIN $ c o n n - > w r i t e ( " k e y . v a l u e 1 2 3 \ n " ) ;

Slide 54

Slide 54 text

WRITING TO MUNIN

Slide 55

Slide 55 text

OVERVIEW

Slide 56

Slide 56 text

THE THING I LIKE ABOUT THIS PROJECT

Slide 57

Slide 57 text

IT JUST KEEPS GOING

Slide 58

Slide 58 text

BONUS CONTENT

Slide 59

Slide 59 text

PUBSUB $ p r e d i s - > s e t ( ' w y r i m a p s _ n e t : s t r e e t v i e w : g e n e r a t o r : s t e p ' , 1 2 3 ) ; $ p r e d i s - > s e t ( ' w y r i m a p s _ n e t : s t r e e t v i e w : g e n e r a t o r : s t a t u s ' , ' S o m e s t a t u s m e s s a g e ' ) ;

Slide 60

Slide 60 text

WORKER2REDIS

Slide 61

Slide 61 text

PUBSUB $ p u b s u b P r e d i s - > p u b s u b ( ' _ _ k e y s p a c e @ 6 _ _ : w m n : s t r v : g e n : s ' , f u n c t i o n ( $ e v e n t ) { $ p u b s u b P r e d i s G e t - > g e t ( ' w m n : s t r v : g e n : s ' , f u n c t i o n ( $ s t a t u s , $ c l i e n t ) { $ t h i s - > b r o a d c a s t ( ' W y r i m a p s N e t . S t r v G e n . U p d a t e s . S ' , [ ' s t e p ' = > $ s t a t u s ] ) ; } ) ; } ) ;

Slide 62

Slide 62 text

REDIS2RATCHET

Slide 63

Slide 63 text

PACKAGES BUILD ON REACT RobinvdVleuten/react-nntp beaucollins/phluid-php bergie/dnode-php bixuehujin/reactphp-mysql bzikarsky/gearman-async cboden/Ratchet clue/buzz-react clue/icmp-react clue/psocksd clue/redis-react From: https://github.com/reactphp/react/wiki/Users

Slide 64

Slide 64 text

PACKAGES BUILD ON REACT clue/redis-server clue/socket-react clue/socks-react clue/wol-react clue/zenity-react evan108108/react-mongrel2 ianbarber/eep-php jolicode/php-ar-drone markwilson/publictweetstream-php mkjpryor/async From: https://github.com/reactphp/react/wiki/Users

Slide 65

Slide 65 text

PACKAGES BUILD ON REACT mkraemer/react-inotify mkraemer/react-pcntl nrk/predis-async phergie3 recoil/recoil rithis-archive/find-your-domain sculpin umpirsky/wisdom wyrihaximus/phunin-node wyrihaximus/react-guzzle From: https://github.com/reactphp/react/wiki/Users

Slide 66

Slide 66 text

$LOOP->STOP(); A talk by / Cees-Jan Kiewiet @WyriHaximus Please rate this talk: https://joind.in/11455 Questions?