@JomLaunch 2021
Build your High Concurrency App
with PHP and Swoole
Albert Chen
About Me
{
"data": {
"human": {
"name": "Albert Chen",
"occupation": "Software Architect",
"website": "https://albert-chen.com",
"interests": [
"traveling",
"programming",
"cooking"
]
},
"tags": [
"Laravel Artisan",
"Swoole Enthusiast",
"Open Source Contributor"
]
}
}
Outline
• Introduction of Swoole
• PHP’s Internal Lifecycle
• Blocking I/O in PHP
• Server Structure of Swoole
• Benchmark of Swoole
• Coroutine in Swoole
• Some Facts about Swoole
• Q&A
Slido
Join at
slido.com
#760920
Slido
Join at
slido.com
#760920
What is Swoole?
What is Swoole?
• Since 2012
• Open source based on Apache-2.0 License
• 17k stars until July 2021
• More than 100 contributors
• Adopted by many enterprises in China
• O
ffi
cially supported by Laravel Octane
What is Swoole?
• A C extension for PHP
• An asynchronous network engine for PHP
• Features:
• Event-driven non-blocking I/O
• HTTP / HTTP2 / Websocket / TCP / UDP
• Coroutine (CSP Model)
• Excellent performance for high concurrency
What is Swoole?
• Not a new language, but an extension for PHP
• Provides many new features for traditional PHP
• New lifecycle in Swoole
• Server patterns, coroutine, async I/O, Process Management, etc.
• It's still under active development
• Stable for production environment
• High performance
Usage Statistics for Websites
PHP’s Benchmark
https://kinsta.com/blog/php-benchmarks/
Benchmark Comparison
https://www.toptal.com/back-end/server-side-io-performance-node-php-java-go
Why PHP Performs
Poorly in High Concurrency?
PHP Lifecycle
How many files are required for one
request in Laravel?
426
get_included_files()
In Laravel 8.52
Stateless PHP
• How do we serve PHP today?
• PHP-FPM
• mod_php for Apache
• Both patterns are all stateless
Stateless PHP
• Pros
• Easy scaling
• Simple, less risk causing memory leaks
• Cons
• States can't be shared between requests
• States must rely on external storages
• Resources can't be reused e
ffi
ciently
• Connection cost is expensive (like database)
• Not good for high performance
Blocking I/O in PHP
• PHP is originally created as glue layer to call C functions
• The I/O model is blocking by default
• Almost all client-side libraries involving I/O are blocking
• Multiple process for handling blocking I/O
• I/O bound concurrency depends on process number
• Cost for context switch in processes is expensive
Blocking I/O in PHP
• Resource can't be reused
• I/O requests are blocking
• 80% time cost on blocking I/O
Blocking I/O in PHP
Event Loop in NodeJS
Concurrency Problem
• 100 requests at the same time need 100 processes
• 100 connections will be established as well
• Scale to increase concurrency
Let’s See What Changes
in Swoole
Server Structure in Swoole
PHP Lifecycle in Swoole
Run only once!
Server Structure in Swoole
• Code Is Persistent in Memory
• Swoole Server Takes Lifecycle Over PHP
• Reduce Initialization Steps
• Reduce Response Latency
• Event-driven Non-blocking I/O for Requests
Benchmark Comparison
between Go and Swoole
Server Benchmark in Go
Server Benchmark in Go
Server Benchmark in PHP
Server Benchmark in PHP
This Doesn’t Mean
PHP with Swoole is Faster Than Go
(Of Course Not)
Coroutine in Swoole
Coroutine in Swoole
• Non-Blocking I/Os are scheduled by coroutine automatically.
PHP is the best
Swoole is awesome!
Hello world!
Coroutine in Swoole
Hello Swoole
1.2.3.4
• Non-Blocking I/Os are scheduled by coroutine automatically.
Coroutine in Swoole
1.2.3.4
1.2.3.4
1.2.3.4
1.2.3.4
…
Hello Swoole!
• Non-Blocking I/Os are scheduled by coroutine automatically.
Coroutine in Swoole
Hello Swoole!
1.2.3.4
1.2.3.4
1.2.3.4
1.2.3.4
…
• Non-Blocking I/Os are scheduled by coroutine automatically.
Coroutine in Swoole
• CSP Model
1
2
3
4
5
Some Facts about Swoole
• Most of traditional PHP projects needs to be refactored.
• Convert requests and responses
Some Facts about Swoole
• Global states in PHP needs to be used more carefully. (eg. $_GET,
$_POST, static, global)
Some Facts about Swoole
• Global states in PHP needs to be used more carefully. (eg. $_GET,
$_POST, static, global)
Some Facts about Swoole
• Don’t use exit/die function in your PHP application.
Some Facts about Swoole
• Memory leak may happen!!!
Some Facts about Swoole
• You can try Hyperf framework for your new projects.
Hyperf = Hyperspeed + Flexibility
https://www.hyperf.io
Some Facts about Swoole
• Swoole is now o
ffi
cially supported by Laravel team.
• Laravel will become friendly in long-running server
• Some Octane features rely on Swoole
• No coroutine features are supported yet
Some Facts about Swoole
• There’s knowledge gap for traditional PHP developers.
Q&A

How to Build a High Performance Application with PHP and Swoole?