Slide 1

Slide 1 text

4: Introducing the New Coroutine Design Pattern in PHP Demin Yin

Slide 2

Slide 2 text

About Me • Staff Engineer and Technical Lead on Glu Mobile’s Design Home team • Playing with PHP since 2000. • Worked for a diverse group of companies in China and US, including eBay, Visa and Glu • Focus on building high performance, secure web services • Born in China, worked in U.S., live in Canada • On twitter: @deminy • On Github: https://github.com/deminy 2

Slide 3

Slide 3 text

Agenda • What Is Swoole? • Benchmark Results • Swoole 4: Asynchronous Programming with Coroutines • Top Swoole Use Cases • History of Swoole, and What's New in Swoole 4 • The Future of Swoole • Q & A 3

Slide 4

Slide 4 text

Agenda • What Is Swoole? • Benchmark Results • Swoole 4: Asynchronous Programming with Coroutines • Top Swoole Use Cases • History of Swoole, and What's New in Swoole 4 • The Future of Swoole • Q & A 4

Slide 5

Slide 5 text

What Is Swoole: How Does Swoole Work? 5 under PHP-FPM under Swoole

Slide 6

Slide 6 text

6 • Event-driven; asynchronous I/O. • Coroutines, channels, defer, and more. • Connection pool. • Build high performance, concurrent HTTP, WebSocket, TCP, UDP, Unix socket services. What Is Swoole: Enrich PHP with Some Amazing Features

Slide 7

Slide 7 text

Agenda 7 • What Is Swoole? • Benchmark Results • Swoole 4: Asynchronous Programming with Coroutines • Top Swoole Use Cases • History of Swoole, and What's New in Swoole 4 • The Future of Swoole • Q & A

Slide 8

Slide 8 text

Benchmark Results: Single Query 8 Source: the TechEmpower Framework Benchmarks project best database-access responses per second, single query

Slide 9

Slide 9 text

Benchmark Results: Multiple Queries 9 Source: the TechEmpower Framework Benchmarks project responses per second at 20 queries per request, 256 requests concurrently

Slide 10

Slide 10 text

Benchmark Results: Fortunes 10 Source: the TechEmpower Framework Benchmarks project best fortunes responses per second

Slide 11

Slide 11 text

Benchmark Results: Why Faster? 11 Why is Swoole faster? • Connection pool. • Extra operations when using PDO: • Message sent to MySQL server to deallocate the prepared statement when destroying a PDOStatement object. • Message sent to MySQL server to close the MySQL connection when destroying a PDO object. • ……

Slide 12

Slide 12 text

Agenda 12 • What Is Swoole? • Benchmark Results • Swoole 4: Asynchronous Programming with Coroutines • Top Swoole Use Cases • History of Swoole, and What's New in Swoole 4 • The Future of Swoole • Q & A

Slide 13

Slide 13 text

Coroutine in Swoole 4: an example 13 under PHP under Swoole 4

Slide 14

Slide 14 text

Coroutine in Swoole 4: an example (cont.) 14 under PHP under Swoole 4

Slide 15

Slide 15 text

output: 123456 Coroutine in Swoole 4: an example (cont.) 15

Slide 16

Slide 16 text

Processes, Threads, and Coroutines 16 Multiprocessing Multithreading Coroutine Creation fork() pthread_create() go() Scheduling expensive cheap extremely cheap Concurrency hundreds thousands hundreds of thousands Programming difficult very difficult easy

Slide 17

Slide 17 text

Create a Server Socket in PHP 17 under PHP

Slide 18

Slide 18 text

Create a Server Socket in Swoole 4 18 under Swoole 4

Slide 19

Slide 19 text

Coroutine: What’s the benefits? 19 • A coroutine can be paused when IO happens, and resumed after IO finishes. • PHP code still executed in sequential manner. • No new processes or threads created. Low costs on “scheduling”. • No locks needed when updating shared resources from different coroutines. • High concurrency. • Easier to use, especially when comparing to asynchronous callbacks.

Slide 20

Slide 20 text

Coroutines in For Loop 20

Slide 21

Slide 21 text

Nested Coroutines 21

Slide 22

Slide 22 text

Nested Coroutines (cont.) 22

Slide 23

Slide 23 text

Nested Coroutines (cont.) 23 output: 127983465 output: 123456789

Slide 24

Slide 24 text

Blocking I/O in PHP 24 • PHP extension MySQLi, PDO: \Swoole\Coroutine\MySQL • PHP extension Redis: \Swoole\Coroutine\Redis • sleep(), usleep() : … • sockets and streams: … • file_get_contents(), fread(), fwrite() : … • …… • PHP extension SOAP. • PHP extension MongoDB.

Slide 25

Slide 25 text

Swoole 4: Channels 25

Slide 26

Slide 26 text

Swoole 4: Channels (cont.) 26 SplQueue Channels push() SplQueue>push() Always successful until memory exhausted. chan::push() Blocks if running out of allocated space. pop() SplQueue>pop() Throws an exception when the queue is empty. chan::pop() Blocks if no data available.

Slide 27

Slide 27 text

Swoole 4: Channels (cont.) 27

Slide 28

Slide 28 text

Swoole 4: defer 28

Slide 29

Slide 29 text

Swoole 4: defer (cont.) 29 Golang (pseudocode) PHP (pseudocode)

Slide 30

Slide 30 text

Agenda 30 • What Is Swoole? • Benchmark Results • Swoole 4: Asynchronous Programming with Coroutines • Top Swoole Use Cases • History of Swoole, and What's New in Swoole 4 • The Future of Swoole • Q & A

Slide 31

Slide 31 text

Top Swoole Use Cases 31 • Crawlers. • HTTP/RPC. • IM, online chat room. • Internet of things. • Gaming servers.

Slide 32

Slide 32 text

Agenda 32 • What Is Swoole? • Benchmark Results • Swoole 4: Asynchronous Programming with Coroutines • Top Swoole Use Cases • History of Swoole, and What's New in Swoole 4 • The Future of Swoole • Q & A

Slide 33

Slide 33 text

History of Swoole 33 • 2012-07: First Git commit. • 2013-04: Swoole 1 released. • 2016-12: Swoole 2 released. • 2018-06: Swoole 4 released.

Slide 34

Slide 34 text

The Future of Swoole (cont.) 34 A dedicated development team for the Swoole ecosystem, with more supports to the open source community: • SDLC process improvements. • Improved documentation. • Lots of refactors. • More components like ZooKeeper, Kafka, Hadoop, HBase, etcd, grpc, AMQP, MQTT, etc.

Slide 35

Slide 35 text

Swoole 4.1 35 • 4.1.0: Added stream hook: support asynchronous IO on Redis, PDO, MySQLi. • 4.1.2: Added socket hook: allow building coroutine versions of PHP extensions for MongoDB, ZooKeeper and more.

Slide 36

Slide 36 text

Swoole 4.1: Stream Hook 36

Slide 37

Slide 37 text

Swoole 4.1: Stream Hook (cont.) 37

Slide 38

Slide 38 text

Swoole 4.1: Stream Hook (cont.) 38 ≈

Slide 39

Slide 39 text

Agenda 39 • What Is Swoole? • Benchmark Results • Swoole 4: Asynchronous Programming with Coroutines • Top Swoole Use Cases • History of Swoole, and What's New in Swoole 4 • The Future of Swoole • Q & A

Slide 40

Slide 40 text

The Future of Swoole 40 • Latest stable release: 4.3.0 • Swoole 5.0 • Coroutines only. • Clean up legacy code.

Slide 41

Slide 41 text

The Future of Swoole (cont.) 41 lots of changes in Swoole since 2018 Source: https://github.com/swoole/swoole-src/graphs/contributors

Slide 42

Slide 42 text

Resources 42 • Sample code of this talk: https://github.com/deminy/swoole-by-examples • Swoole: https://github.com/swoole/swoole-src • Swoole frameworks: • https://github.com/zendframework/zend-expressive-swoole • https://github.com/easy-swoole/easyswoole • https://github.com/swoft-cloud/swoft/ • https://github.com/swooletw/awesome-swoole

Slide 43

Slide 43 text

43 QUESTIONS?

Slide 44

Slide 44 text

44 Thanks Demin Yin Email: [email protected] Twitter: @deminy GitHub: https://github.com/deminy