Concurrent PHP in the Etsy API
-
Upload
matt-graham -
Category
Software
-
view
919 -
download
0
description
Transcript of Concurrent PHP in the Etsy API
![Page 1: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/1.jpg)
Concurrent PHPin the Etsy API
Matthew Graham@lapsu
@EtsyAPI Lead#phpday2014 April
![Page 2: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/2.jpg)
@lapsu@EtsyAPI
![Page 3: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/3.jpg)
@lapsu@EtsyAPI
$1.3 BillionThings That Matter
![Page 4: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/4.jpg)
@lapsu@EtsyAPI
![Page 5: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/5.jpg)
@lapsu
Etsy's PHP
www api adminqueues cron
@EtsyAPI
![Page 6: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/6.jpg)
@lapsu
~200 engineers
30+ deploys / day
@EtsyAPI
![Page 7: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/7.jpg)
Also, Rasmus
@lapsu@EtsyAPI
![Page 8: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/8.jpg)
Spoilers
@lapsu
Mobile Clients Are Special
1 Thread != No Concurrency
@EtsyAPI
![Page 9: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/9.jpg)
@lapsu
<motivation>
@EtsyAPI
![Page 10: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/10.jpg)
Premise:
@lapsu
The Future is Mobile
@EtsyAPI
![Page 11: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/11.jpg)
@lapsu
Past The Future is Mobile
November 2013
@EtsyAPI
![Page 12: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/12.jpg)
@lapsu@EtsyAPI
![Page 13: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/13.jpg)
@EtsyAPI
Mobile Networks Suck
@lapsu
<
![Page 14: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/14.jpg)
@EtsyAPI
Not Mobile
@lapsu
www.etsy.com/shop/AVintageWanderer
![Page 15: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/15.jpg)
@EtsyAPI
Network Performance
@lapsu
3G < 4G
![Page 16: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/16.jpg)
@EtsyAPI
Network Coverage
@lapsu
3G > 4G
![Page 17: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/17.jpg)
@EtsyAPI
Mobile Requests
@lapsu
More != Better
![Page 18: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/18.jpg)
@lapsu@EtsyAPI
![Page 19: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/19.jpg)
@lapsu
1000ms Time To Glass
@EtsyAPI
![Page 20: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/20.jpg)
@lapsu
1000ms- 900ms
-------------100ms
Network/Client------------------------ Server
@EtsyAPI
![Page 21: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/21.jpg)
@lapsu
100ms = Bespoke + Concurrent
@EtsyAPI
![Page 22: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/22.jpg)
@lapsu
Single Threads
@EtsyAPI
![Page 23: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/23.jpg)
Concurrency
@lapsu@EtsyAPI
Main “Thread”
Child “Thread” Child “Thread”
![Page 24: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/24.jpg)
@lapsu
</motivation><interface>
@EtsyAPI
![Page 25: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/25.jpg)
Paul goes to Netflix
@lapsu@EtsyAPI
![Page 26: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/26.jpg)
1 View : 1 Bespoke
@lapsu@EtsyAPI
ClientView
Bespoke
View View
Bespoke BespokeAPI
![Page 27: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/27.jpg)
Multiple Clients
@lapsu@EtsyAPI
ClientsView
Bespoke
View View
Bespoke BespokeAPI
![Page 28: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/28.jpg)
Bespoke : Components
@lapsu@EtsyAPI
Bespoke Bespoke BespokeAPI
Item User Shop Favs Tx
![Page 29: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/29.jpg)
Components as REST
@lapsu@EtsyAPI
Bespoke BespokeAPI
Item User Shop Favs Tx
![Page 30: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/30.jpg)
@lapsu
?includes=User
@EtsyAPI
![Page 31: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/31.jpg)
Android User View
@lapsu
function handle($cli, $inp) { $shop = $cli->shop($inp->user_id); $favs = $cli->favs($inp->user_id); $items = $cli->items($shop->shop_id);
Curl_Orchestrator::run( [$shop,$favs,$items]); return [$favs,$items];}
@EtsyAPI
![Page 32: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/32.jpg)
Concurrent Client
@lapsu
function handle($cli, $inp) { $shop = $cli->shop($inp->user_id); $favs = $cli->favs($inp->user_id); $items = $cli->items($shop->shop_id);
Curl_Orchestrator::run( [$shop,$favs,$items]); return [$favs,$items];}
@EtsyAPI
![Page 33: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/33.jpg)
Making Requests
@lapsu
function handle($cli, $inp) { $shop = $cli->shop($inp->user_id); $favs = $cli->favs($inp->user_id); $items = $cli->items($shop->shop_id);
Curl_Orchestrator::run( [$shop,$favs,$items]); return [$favs,$items];}
@EtsyAPI
![Page 34: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/34.jpg)
@lapsu@EtsyAPI
shop
favs
t0 t1
![Page 35: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/35.jpg)
Inputs
@lapsu
function handle($cli, $inp) { $shop = $cli->shop($inp->user_id); $favs = $cli->favs($inp->user_id); $items = $cli->items($shop->shop_id);
Curl_Orchestrator::run( [$shop,$favs,$items]); return [$favs,$items];}
@EtsyAPI
![Page 36: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/36.jpg)
Future Parameters
@lapsu
function handle($cli, $inp) { $shop = $cli->shop($inp->user_id); $favs = $cli->favs($inp->user_id); $items = $cli->items($shop->shop_id);
Curl_Orchestrator::run( [$shop,$favs,$items]); return [$favs,$items];}
@EtsyAPI
![Page 37: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/37.jpg)
@lapsu@EtsyAPI
shop
favs
items
t0 t1 t2 t3 t4
![Page 38: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/38.jpg)
~6 Lines
@lapsu
function handle($cli, $inp) { $shop = $cli->shop($inp->user_id); $favs = $cli->favs($inp->user_id); $items = $cli->items($shop->shop_id);
Curl_Orchestrator::run( [$shop,$favs,$items]); return [$favs,$items];}
@EtsyAPI
![Page 39: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/39.jpg)
@lapsu
</interface><performance>
@EtsyAPI
![Page 40: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/40.jpg)
@lapsu
Web Pages Are Clients Too
@EtsyAPI
![Page 41: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/41.jpg)
Web First
@lapsu@EtsyAPI
![Page 42: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/42.jpg)
API First
@lapsu@EtsyAPI
![Page 43: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/43.jpg)
Android User View
@lapsu
function handle($cli, $inp) { $shop = $cli->shop($inp->user_id); $favs = $cli->favs($inp->user_id); $items = $cli->items($shop->shop_id);
Curl_Orchestrator::run( [$shop,$favs,$items]); return [$favs,$items];}
@EtsyAPI
![Page 44: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/44.jpg)
Desktop Web User View
@lapsu
function handle($cli, $inp) { $shop = $cli->shop($inp->user_id); $favs = $cli->favs($inp->user_id); $items = $cli->items($shop->shop_id); $teams = $cli->teams($inp->user_id);
Curl_Orchestrator::run( [$shop,$favs,$items,$teams]); return [$favs,$items,$teams];}
@EtsyAPI
![Page 45: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/45.jpg)
@lapsu
Activity Feed
@EtsyAPI
![Page 46: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/46.jpg)
@lapsu
Activity FeedPage
@EtsyAPI
HomePage
![Page 47: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/47.jpg)
30s of HTTP Time
@lapsu@EtsyAPI
![Page 48: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/48.jpg)
30s of HTTP Time
@lapsu
880ms Real Time
@EtsyAPI
![Page 49: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/49.jpg)
Components
@lapsu@EtsyAPI
Bespoke Bespoke Bespoke
API
Item User Shop Favs Tx
![Page 50: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/50.jpg)
Components Cache
@lapsu@EtsyAPI
Bespoke Bespoke Bespoke
CacheAPI
Item User Shop Favs Tx
![Page 51: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/51.jpg)
Local Call
@lapsu@EtsyAPI
Me
![Page 52: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/52.jpg)
Long Distance Call
@lapsu@EtsyAPI
AtlanticOcean User
![Page 53: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/53.jpg)
Long Distance Call
@lapsu@EtsyAPI
AtlanticOcean
API
Templates
User
![Page 54: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/54.jpg)
@lapsu
</performance><internals>
@EtsyAPI
![Page 55: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/55.jpg)
@lapsu
curl_multi_*
@EtsyAPI
![Page 56: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/56.jpg)
@lapsu@EtsyAPI
curl?
![Page 57: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/57.jpg)
General Sequence
@lapsu@EtsyAPI
curl_multi_init();curl_multi_add();curl_multi_exec();
while (!$done) { curl_multi_select(); curl_multi_exec(); curl_multi_info_read();}
![Page 58: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/58.jpg)
curl_multi_init
@lapsu@EtsyAPI
$mh = curl_multi_init();
![Page 59: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/59.jpg)
curl_multi_add_handle
@lapsu@EtsyAPI
$mh = curl_multi_init();$ch = curl_init($url);curl_setopt_array($ch, $options);curl_multi_add_handle($mh, $ch);
![Page 60: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/60.jpg)
@lapsu@EtsyAPI
multi handle
handle handle handle
![Page 61: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/61.jpg)
curl_multi_exec
@lapsu@EtsyAPI
do { $code = curl_multi_exec($mh, $r);} while ($code == CURLM_CALL_MULTI_PERFORM);
![Page 62: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/62.jpg)
curl_multi_select
@lapsu@EtsyAPI
$cnt = curl_multi_select($mh, $tmout);
![Page 63: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/63.jpg)
curl_multi_info_read
@lapsu@EtsyAPI
$info = curl_multi_info_read($mh);$ch = $info['handle'];$content = curl_multi_getcontent($ch);
![Page 64: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/64.jpg)
@lapsu@EtsyAPI
![Page 65: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/65.jpg)
localhost: Expected
@lapsu@EtsyAPI
R1
R2
R3
t0
![Page 66: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/66.jpg)
Network: Actual
@lapsu@EtsyAPI
R2
R3
t0 t1
R1
![Page 67: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/67.jpg)
curl Protocols
@lapsu@EtsyAPI
HTTP LDAP
Gopher POP3 IMAP
TELNET TFTP
![Page 68: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/68.jpg)
curl_get_multi_handle_state
@lapsu@EtsyAPI
$state = CURLM_STATE_FIRST;curl_multi_get_handle_state( $mh, $ch, $state);$sent = $state > CURLM_STATE_FIRST && $state < CURLM_STATE_PERFORM;
![Page 69: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/69.jpg)
Expected, Actual
@lapsu@EtsyAPI
R1
R2
R3
t0
![Page 70: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/70.jpg)
Revised Sequence
@lapsu@EtsyAPI
curl_multi_init();curl_multi_add();while (!$sent) { curl_multi_exec(); curl_multi_get_handle_state();}
while (!$done) { curl_multi_select(); curl_multi_exec(); curl_multi_info_read();}
![Page 71: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/71.jpg)
Still Headed Upstream
@lapsu@EtsyAPI
![Page 72: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/72.jpg)
Patch URL
@lapsu
bit.ly/etsy_curl_multi_patch
@EtsyAPI
![Page 73: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/73.jpg)
Recursion?
@lapsu@EtsyAPI
![Page 74: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/74.jpg)
Recursion?
@lapsu
No.
@EtsyAPI
![Page 75: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/75.jpg)
Recursion?
@lapsu
No?Not yet.
@EtsyAPI
![Page 76: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/76.jpg)
Visibility
@lapsu@EtsyAPI
![Page 77: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/77.jpg)
@lapsu
PHP Coroutines
@EtsyAPI
![Page 78: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/78.jpg)
More Code
@lapsu
Available Upon Request
@EtsyAPI
![Page 79: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/79.jpg)
@lapsu
codeascraft.etsy.com
@EtsyAPI
![Page 80: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/80.jpg)
@lapsu
</internals><wrap/>
@EtsyAPI
![Page 81: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/81.jpg)
@lapsu
Address Mobile Challenges
@EtsyAPI
![Page 82: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/82.jpg)
@lapsu
PHP Does Concurrency
@EtsyAPI
![Page 83: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/83.jpg)
PHP Abides
@lapsu@EtsyAPI
![Page 84: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/84.jpg)
Concurrent PHP
in the Etsy APIMatthew Graham
@lapsu@EtsyAPI Lead
#phpday2014 April
Thank You
![Page 85: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/85.jpg)
Reminder:
@lapsu
Repeat the questions
@EtsyAPI
![Page 86: Concurrent PHP in the Etsy API](https://reader036.fdocuments.net/reader036/viewer/2022062300/5565bf86d8b42a48268b5036/html5/thumbnails/86.jpg)
@lapsu
SPDY / HTTP 2.0
@EtsyAPI