Meet a parallel, asynchronous PHP world
-
Upload
stefano-maraspin -
Category
Software
-
view
459 -
download
3
Transcript of Meet a parallel, asynchronous PHP world
![Page 1: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/1.jpg)
PHPDay 2015 – Verona, Italy, May 16th 2015
Meet a Parallel Asynchronous PHP World
![Page 2: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/2.jpg)
STEVE @MARASPIN
![Page 3: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/3.jpg)
![Page 4: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/4.jpg)
http://www.mvlabs.it/
![Page 5: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/5.jpg)
USE CASE
![Page 6: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/6.jpg)
6
![Page 7: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/7.jpg)
7
![Page 8: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/8.jpg)
AWESOME PHP MUM
![Page 9: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/9.jpg)
How does it work?
9
![Page 10: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/10.jpg)
We have a client…
10
![Page 11: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/11.jpg)
11
What do you want for lunch?
![Page 12: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/12.jpg)
12
![Page 13: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/13.jpg)
13
Cool. BRB!
![Page 14: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/14.jpg)
PHP Makes I/O Requests…
14
![Page 15: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/15.jpg)
PHP awaits for I/O…
15
![Page 16: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/16.jpg)
I/O Ready
16
![Page 17: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/17.jpg)
Content Delivered
17
![Page 18: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/18.jpg)
DELICIOUS LUNCH!
![Page 19: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/19.jpg)
GOING ENTERPRISE
![Page 20: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/20.jpg)
TROUBLES ARISE
![Page 21: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/21.jpg)
21
![Page 22: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/22.jpg)
22
![Page 23: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/23.jpg)
23
~20s
![Page 24: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/24.jpg)
WHY SO MUCH TIME?
![Page 25: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/25.jpg)
25
![Page 26: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/26.jpg)
26
![Page 27: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/27.jpg)
27
![Page 28: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/28.jpg)
28
![Page 29: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/29.jpg)
29
![Page 30: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/30.jpg)
30
![Page 31: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/31.jpg)
31
What do you want for lunch?
![Page 32: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/32.jpg)
32
![Page 33: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/33.jpg)
33
![Page 34: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/34.jpg)
34
![Page 35: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/35.jpg)
35
What do you want for lunch?
![Page 36: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/36.jpg)
![Page 37: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/37.jpg)
Gotta look for a better strategy…
37
![Page 38: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/38.jpg)
38
What do you want for lunch?
![Page 39: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/39.jpg)
39
What do you want for lunch?
![Page 40: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/40.jpg)
40
What do you want for lunch?
![Page 41: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/41.jpg)
41
![Page 42: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/42.jpg)
42
![Page 43: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/43.jpg)
43
![Page 44: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/44.jpg)
44
![Page 45: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/45.jpg)
45
![Page 46: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/46.jpg)
46
![Page 47: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/47.jpg)
47
![Page 48: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/48.jpg)
48
![Page 49: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/49.jpg)
49
curl_multi_add_handle
![Page 50: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/50.jpg)
50
curl_multi_exec
curl_multi_info_read
curl_multi_getcontent
![Page 51: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/51.jpg)
51
curl_multi_exec
curl_multi_info_read
curl_multi_getcontent
![Page 52: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/52.jpg)
52
curl_multi_exec
curl_multi_info_read
curl_multi_getcontent
![Page 53: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/53.jpg)
53
![Page 54: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/54.jpg)
54
~20s ~2s
![Page 55: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/55.jpg)
55
Ordered Results
![Page 56: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/56.jpg)
56
No More!
![Page 57: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/57.jpg)
Solution #1: PHP Asynchronous Calls
57
![Page 58: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/58.jpg)
58
• Within PHP • Easy to use
Pros Cons
• Limited set of available commands
![Page 59: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/59.jpg)
VARIETY WANTED
![Page 60: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/60.jpg)
CHEFS TO THE RESCUE
![Page 61: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/61.jpg)
61
![Page 62: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/62.jpg)
Simple Message Queue
![Page 63: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/63.jpg)
Multiple Consumers / Workers
![Page 64: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/64.jpg)
More Decoupling…
![Page 65: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/65.jpg)
JACK OF ALL TRADES
![Page 66: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/66.jpg)
66
Useful if already within stack & simple system – please take a look: http://antirez.com/news/88
![Page 67: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/67.jpg)
67
![Page 68: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/68.jpg)
68
lPush
![Page 69: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/69.jpg)
69
brPop
![Page 70: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/70.jpg)
70
![Page 71: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/71.jpg)
71
![Page 72: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/72.jpg)
72
batch_basic_publish / basic_publish
![Page 73: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/73.jpg)
73
basic_consume
![Page 74: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/74.jpg)
74
![Page 75: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/75.jpg)
75
What do you want for lunch?
![Page 76: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/76.jpg)
76
What do you want for lunch?
![Page 77: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/77.jpg)
77
What do you want for lunch?
![Page 78: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/78.jpg)
78
![Page 79: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/79.jpg)
79
![Page 80: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/80.jpg)
80
![Page 81: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/81.jpg)
81
![Page 82: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/82.jpg)
82
?
![Page 83: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/83.jpg)
Solution #2: Message Queues
83
![Page 84: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/84.jpg)
84
• Scales well • Can be made
resilient • Decoupling
Pros Cons
• Extra software components
• Lack of Feedback to invoking process
![Page 85: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/85.jpg)
85
![Page 86: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/86.jpg)
86
http://gearman.org/
![Page 87: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/87.jpg)
87
addTaskBackground
![Page 88: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/88.jpg)
88
addFunction
![Page 89: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/89.jpg)
89
![Page 90: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/90.jpg)
90
addTaskBackground
![Page 91: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/91.jpg)
91
addTask
![Page 92: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/92.jpg)
92
![Page 93: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/93.jpg)
93
~20s
![Page 94: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/94.jpg)
94
OK, so just prepare …
![Page 95: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/95.jpg)
95
![Page 96: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/96.jpg)
96
![Page 97: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/97.jpg)
97
![Page 98: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/98.jpg)
98
![Page 99: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/99.jpg)
99
![Page 100: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/100.jpg)
100
![Page 101: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/101.jpg)
101
![Page 102: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/102.jpg)
102
![Page 103: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/103.jpg)
103
OK, so just prepare …
We need multiple (parallel) workers if we wish to improve performance
![Page 104: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/104.jpg)
Solution #3: Job Server
104
![Page 105: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/105.jpg)
105
• Scales well • Decoupling • Possibly
resilient • Return Values
Pros Cons
• Extra software components
• Extra processes
![Page 106: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/106.jpg)
PHP FAMILY BUSINESS
![Page 107: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/107.jpg)
107
What do you want for lunch?
What do you want for lunch?
What do you want for lunch?
![Page 108: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/108.jpg)
108
![Page 109: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/109.jpg)
109
![Page 110: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/110.jpg)
110
![Page 111: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/111.jpg)
111
![Page 112: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/112.jpg)
112
Background exec
![Page 113: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/113.jpg)
113
![Page 114: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/114.jpg)
114
What do you want for lunch?
![Page 115: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/115.jpg)
115
? ? ?
Same problem as before…
![Page 116: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/116.jpg)
Solution #4: Exec & Co.
116
![Page 117: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/117.jpg)
117
• Very easy to implement
Pros Cons
• No return values
• Extra processes
![Page 118: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/118.jpg)
PHP THREADS
![Page 119: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/119.jpg)
pthreads
"pthreads requires a build of PHP with ZTS (Zend Thread Safety) enabled"
119
![Page 120: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/120.jpg)
pthreads
"pthreads requires a build of PHP with ZTS (Zend Thread Safety) enabled"
120
![Page 121: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/121.jpg)
MUM GOT DAUGHTER(S)
![Page 122: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/122.jpg)
122
![Page 123: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/123.jpg)
123
pcntl_fork
![Page 124: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/124.jpg)
124
pcntl_waitpid
![Page 125: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/125.jpg)
125
![Page 126: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/126.jpg)
126
What do you want for lunch?
What do you want for lunch?
![Page 127: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/127.jpg)
127
![Page 128: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/128.jpg)
128
![Page 129: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/129.jpg)
129
What do you want for lunch?
![Page 130: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/130.jpg)
Solution #5: Forking processes
130
![Page 131: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/131.jpg)
131
• Within PHP • Allows for
parallelism • Exploits available
CPU cores
Pros Cons
• Feedback (besides exit status) difficult to get
• Parallelism bound to # of available CPU cores
• Not to be used within Apache or web servers in general
![Page 132: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/132.jpg)
Latency Comparison Numbers L1 cache reference 0.5 ns
Branch mispredict 5 ns
L2 cache reference 7 ns
Mutex lock/unlock 25 ns
Main memory reference 100 ns
Send 1K bytes over 1 Gbps network 10,000 ns
Read 4K randomly from SSD* 150,000 ns
Read 1 MB sequentially from memory 250,000 ns
Round trip within same datacenter 500,000 ns
Read 1 MB sequentially from SSD* 1,000,000 ns
Disk seek 10,000,000 ns
Read 1 MB sequentially from disk 20,000,000 ns
Send packet CA->Netherlands->CA 150,000,000 ns
Let's consider these numbers…
Source: https://gist.github.com/jboner/2841832
![Page 133: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/133.jpg)
Latency Comparison Numbers L1 cache reference 0.5 ns
Branch mispredict 5 ns
L2 cache reference 7 ns
Mutex lock/unlock 25 ns
Main memory reference 100 ns
Send 1K bytes over 1 Gbps network 10,000 ns
Read 4K randomly from SSD 150,000 ns
Read 1 MB sequentially from memory 250,000 ns
Round trip within same datacenter 500,000 ns
Read 1 MB sequentially from SSD 1,000,000 ns
Disk seek 10,000,000 ns
Read 1 MB sequentially from disk 20,000,000 ns
Send packet CA->Netherlands->CA 150,000,000 ns
We got an I/O issue!
Source: https://gist.github.com/jboner/2841832
![Page 134: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/134.jpg)
Blocking I/O happens when…
Sending an e-mail Communicating with Databases Communicating with other services
Reading/writing data on Disk Reading/writing data on Network …
![Page 135: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/135.jpg)
![Page 136: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/136.jpg)
136
What do you want for lunch?
![Page 137: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/137.jpg)
137
![Page 138: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/138.jpg)
138
What do you want for lunch?
![Page 139: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/139.jpg)
139
![Page 140: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/140.jpg)
140
What do you want for lunch?
![Page 141: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/141.jpg)
141
![Page 142: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/142.jpg)
142
![Page 143: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/143.jpg)
143
![Page 144: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/144.jpg)
144
![Page 145: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/145.jpg)
145
![Page 146: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/146.jpg)
146
![Page 147: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/147.jpg)
147
![Page 148: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/148.jpg)
148
![Page 149: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/149.jpg)
149
![Page 150: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/150.jpg)
150
![Page 151: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/151.jpg)
EVENTS
![Page 152: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/152.jpg)
![Page 153: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/153.jpg)
DIY TIMER
![Page 154: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/154.jpg)
I/O Multiplexing
154
![Page 155: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/155.jpg)
![Page 156: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/156.jpg)
PHP stream_select
156
Runs the equivalent of the select() system call on the given arrays of streams with a timeout specified by tv_sec and tv_usec
![Page 157: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/157.jpg)
157
![Page 158: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/158.jpg)
158
![Page 159: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/159.jpg)
159
![Page 160: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/160.jpg)
Solution #6: stream_select
160
![Page 161: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/161.jpg)
161
• Within PHP • Removes I/O
wait overhead
Pros Cons
• Cumbersome within large projects
• Performances could be better
![Page 162: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/162.jpg)
Libevent
• API providing a mechanism to execute a callback when a specific event occurs on a file descriptor or after a timeout
• supports /dev/poll, kqueue(2), event ports, POSIX select(2), Windows select(), poll(2), and epoll(4) notification mechanisms
162
![Page 163: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/163.jpg)
163
![Page 164: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/164.jpg)
164
![Page 165: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/165.jpg)
Solution #7: libevent
165
![Page 166: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/166.jpg)
166
• Within PHP • More
performant than select
Pros Cons
• Cumbersome within large projects
• Might behave differently within different OSs
![Page 167: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/167.jpg)
WHY A LOUSY OVEN?
![Page 168: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/168.jpg)
WHEN WE COULD USE…
![Page 169: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/169.jpg)
A REACTOR!
![Page 170: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/170.jpg)
Reactor Pattern
![Page 171: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/171.jpg)
![Page 172: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/172.jpg)
event loop
(event1, callback1)
(event2, callback2)
on(event1) (callback1)
on(event2) (callback2)
![Page 173: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/173.jpg)
Implements reactor pattern Formerly known as Node.PHP Non-blocking I/O Event Loop
http://reactphp.org
![Page 174: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/174.jpg)
React
libev libevent
inotify epoll pol event ports kqueue select
![Page 175: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/175.jpg)
175
![Page 176: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/176.jpg)
176
Out of loop: Ignored!
![Page 177: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/177.jpg)
177
![Page 178: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/178.jpg)
HTTP
Socket
Stream
Event Loop
![Page 179: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/179.jpg)
179
![Page 180: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/180.jpg)
180
Promise
![Page 181: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/181.jpg)
181
![Page 182: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/182.jpg)
182
Streams
![Page 183: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/183.jpg)
183
![Page 184: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/184.jpg)
184
![Page 185: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/185.jpg)
185
https://bugs.php.net/bug.php?id=64696
"epoll" itself (used by Libevent on Linux)
doesn't support regular files. Epoll expects
whether sockets, or pipes"
![Page 186: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/186.jpg)
186
Libev uninstalled…
![Page 187: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/187.jpg)
187
![Page 188: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/188.jpg)
188
![Page 189: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/189.jpg)
189
![Page 190: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/190.jpg)
Solution #8: React
190
![Page 191: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/191.jpg)
191
• Wrapper around many event handlers
• Good abstractions
Pros Cons
• Still in 0.x • New
paradigm
![Page 192: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/192.jpg)
SUMMARIZING THINGS
![Page 193: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/193.jpg)
193
Parallel
![Page 194: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/194.jpg)
194
Asynchronous
![Page 195: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/195.jpg)
195
![Page 196: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/196.jpg)
WHAT'S NEXT?
![Page 197: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/197.jpg)
HACK ASYNC
http://docs.hhvm.com/manual/en/hack.async.php
![Page 198: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/198.jpg)
Node.JS Galore
• https://github.com/chobie/php-uv
198
![Page 199: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/199.jpg)
Node.JS Galore
• https://github.com/JosephMoniz/node.php 199
![Page 200: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/200.jpg)
Interesting resources… • Ratchet http://socketo.me/ • Cooperative Multitasking using coroutines https://nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html • Recoil https://github.com/recoilphp/recoil
200
![Page 201: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/201.jpg)
THANK YOU!
![Page 202: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/202.jpg)
Picture Credits
Spider: https://www.flickr.com/photos/janajermakova/10616495683/ Table: https://www.flickr.com/photos/turnstonefurniture/5731379672/ Gnocchi: https://www.flickr.com/photos/cookingetc/6864270056/ Skeptical Dog: https://www.flickr.com/photos/jacobyarborough/13564967155/ Kitchen Accident: https://www.flickr.com/photos/aleksiaaltonen/4803518904/ Variety: https://www.flickr.com/photos/gammaman/6135388116/ Chefs: https://www.flickr.com/photos/lesroches/8700412835/ Man in Kitchen: https://www.flickr.com/photos/paullew/4542993694/ Family: https://www.flickr.com/photos/gareth1953/5173076989/ Organize: https://www.flickr.com/photos/7502393@N04/472028888/ Timer: https://www.flickr.com/photos/lucidscience/5079439604/ Oven: https://www.flickr.com/photos/bonedaddy/2889601088 Presentation: https://www.flickr.com/photos/oecd_development_centre/10168550803/ Reactor: https://www.flickr.com/photos/mandj98/2468396121/ Stirring: https://www.flickr.com/photos/nicoleabalde/7191104180/ Table Ready: https://www.flickr.com/photos/thefalcondale/6940598837/ Other pictures by Steve Maraspin, or from Fotolia Archives
202
![Page 203: Meet a parallel, asynchronous PHP world](https://reader030.fdocuments.in/reader030/viewer/2022032618/55b6e381bb61eb75268b48fb/html5/thumbnails/203.jpg)
Stefano Maraspin @maraspin [email protected]