SlideShare une entreprise Scribd logo
1  sur  53
Télécharger pour lire hors ligne
PHP 的 Web 運⾏行行原理理 ( 2 )
非阻塞 I/O 模式
傳統的 Web PHP 模式問題
⾼高併發請求,會爆 !
問題 1 :
服務如果是⼤大量量 I/O 操作會很浪費資
源 !
ex. 讀 db 或 redis 啥的
問題 2 :
根源在於 :
I/O 操作會 Blocking 住 Process
⼤大量量 I/O 處理理⽅方案
Reactor 模式
Reactor 模式基本上分為兩兩個部份

multiplexing 與 handler

(多路路復⽤用處理理器) 與 ( 事件處理理 )

多路路復⽤用的功能就是可以在⼀一個
process 裡,監控多個 socket。
PHP 的 Reactor 模式實現
ReactPHP 與 Swoole
ReactPHP
ReactPHP 可以讓我們做到
1. 可以建立⼀一個非阻塞 I/O 的網路服務。
2. 可以建立⼀一個定時排程服務。
它是如何解決⼤大量量 I/O
blocking 的問題呢 ?
理理論它是 PHP 版的
Nodejs
I/O 多路路復⽤用
X
timeout
剛剛說是理理論上
PHP 版的 nodejs
但實際上呢 ?
這個 wait 記好
這個請求會得等很久
才會有回應
這時如果我發兩兩條 http 請
求進來來會是什什麼結果呢 ?
Nodejs
2 個 wait !
reactPHP
1 個 wait !
為什什麼呢 ?
因為它不會⾃自動幫你將
I/O 操作丟到 event loop 中
正確版
reactPHP ⼩小總結
1. 它是⼀一個提供事件驅動與非阻塞 I/O 操作的
library。
2. 它非阻塞 I/O 的實現在於 reactor 模式的 single
process event loop 機制。
3. 注意,雖然它理理論上是 php 版的 nodejs,但實
際使⽤用是不⼀一樣的。
Swoole
event-driven asynchronous &
coroutine-based concurrency
networking communication engine
with high performance written in C and
C++ for PHP.
1. 可以建立⼀一個非阻塞 I/O 的網路服務。
2. 可以建立⼀一個定時排程服務。
Swoole 可以讓我們做到
它是如何解決⼤大量量 I/O
blocking 的問題呢 ?
pipe
Worker 與 Task Worker
有什什麼差別呢 ?
Worker
1. 實際運⾏行行 PHP 代碼地⽅方
2. 接受由 Reactor 發送過來來的請求處理理
3. 可以異異步非阻塞與同步阻塞
Task Worker
1. 實際運⾏行行 PHP 代碼地⽅方
2. 接受由 Worker 發送過來來的請求
3. 同步阻塞
4. 它適合處理理需要花時間的運算
Worker 是如何做到異異步非
阻塞 I/O 操作呢 ?
1. task worker 處理理阻塞
2. coroutine 協程 ( 推薦 )
! 注意它不是使⽤用 event loop 機制 !
( 但它有使⽤用 epoll 來來監控從 reactor
來來的 pipeline socket )
範例例
錯誤版
這時如果我發兩兩條 http 請
求進來來會是什什麼結果呢 ?
Swoole
1 個 wait !
⼀一樣是因為沒加入
event loop 嗎 ?
是因為它只有⼀一個 worker
正確版
task worker 處理理阻塞
Coroutine 協程
Swoole ⼩小總結
1. 它是⼀一個使⽤用 c/c++ 寫的專⾨門⽤用來來建立網路路通
訊應⽤用的 php extension。
2. 它非阻塞 I/O 的實現在於 reactor 模式與協程
coroutine。
3. 實際時⽤用時,記得不是寫在它裡⾯面 I/O 就是
非阻塞操作,要⾃自已處理理。
最後
簡單比較

nodjes、reactPHP、swoole
nodejs reactPHP swoole
⼤大量量 I/O
處理理模式
reactor reactor
reactor 、
coroutine
架構 single process single process mutli process
易易⽤用度 淺 還⾏行行 難
web I/O 性能 優 優 更更優
End

Contenu connexe

Similaire à PHP 的 Web 運行原理 - 非阻塞 I/O 模式

Phalcon phpconftw2012
Phalcon phpconftw2012Phalcon phpconftw2012
Phalcon phpconftw2012Rack Lin
 
漫谈php和java
漫谈php和java漫谈php和java
漫谈php和javasulong
 
Ajax设计技术
Ajax设计技术Ajax设计技术
Ajax设计技术yiditushe
 
OpenWebSchool - 03 - PHP Part II
OpenWebSchool - 03 - PHP Part IIOpenWebSchool - 03 - PHP Part II
OpenWebSchool - 03 - PHP Part IIHung-yu Lin
 
Hbase在淘宝的应用与优化 修改
Hbase在淘宝的应用与优化 修改Hbase在淘宝的应用与优化 修改
Hbase在淘宝的应用与优化 修改yp_fangdong
 
Head first in xmemcached yanf4j
Head first in xmemcached yanf4jHead first in xmemcached yanf4j
Head first in xmemcached yanf4jwavefly
 
J Ruby和Rails 让Ruby语言融入Java项目
J Ruby和Rails 让Ruby语言融入Java项目J Ruby和Rails 让Ruby语言融入Java项目
J Ruby和Rails 让Ruby语言融入Java项目George Ang
 
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰Scourgen Hong
 
刘源 人人网服务化与架构变迁V3
刘源 人人网服务化与架构变迁V3刘源 人人网服务化与架构变迁V3
刘源 人人网服务化与架构变迁V3drewz lin
 
專案分層架構 twMVC#18
專案分層架構 twMVC#18專案分層架構 twMVC#18
專案分層架構 twMVC#18twMVC
 
twMVC#18 | 專案分層架構
twMVC#18 | 專案分層架構twMVC#18 | 專案分層架構
twMVC#18 | 專案分層架構twMVC
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程yiditushe
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程appollo0312
 
基于协程的网络开发框架的设计与实现
基于协程的网络开发框架的设计与实现基于协程的网络开发框架的设计与实现
基于协程的网络开发框架的设计与实现mysqlops
 
CodeIgniter 2.0.X
CodeIgniter 2.0.XCodeIgniter 2.0.X
CodeIgniter 2.0.XBo-Yi Wu
 
Nodejs异步的原理和缺陷
Nodejs异步的原理和缺陷Nodejs异步的原理和缺陷
Nodejs异步的原理和缺陷mysqlops
 
introduction of web 2.0
introduction of web 2.0introduction of web 2.0
introduction of web 2.0soboring
 
Nosql七种武器之长生剑 mongodb的使用介绍
Nosql七种武器之长生剑 mongodb的使用介绍Nosql七种武器之长生剑 mongodb的使用介绍
Nosql七种武器之长生剑 mongodb的使用介绍yczealot
 

Similaire à PHP 的 Web 運行原理 - 非阻塞 I/O 模式 (20)

Phalcon phpconftw2012
Phalcon phpconftw2012Phalcon phpconftw2012
Phalcon phpconftw2012
 
漫谈php和java
漫谈php和java漫谈php和java
漫谈php和java
 
Hadoop ecosystem
Hadoop ecosystemHadoop ecosystem
Hadoop ecosystem
 
Ajax设计技术
Ajax设计技术Ajax设计技术
Ajax设计技术
 
OpenWebSchool - 03 - PHP Part II
OpenWebSchool - 03 - PHP Part IIOpenWebSchool - 03 - PHP Part II
OpenWebSchool - 03 - PHP Part II
 
Hbase在淘宝的应用与优化 修改
Hbase在淘宝的应用与优化 修改Hbase在淘宝的应用与优化 修改
Hbase在淘宝的应用与优化 修改
 
Head first in xmemcached yanf4j
Head first in xmemcached yanf4jHead first in xmemcached yanf4j
Head first in xmemcached yanf4j
 
Html5
Html5Html5
Html5
 
J Ruby和Rails 让Ruby语言融入Java项目
J Ruby和Rails 让Ruby语言融入Java项目J Ruby和Rails 让Ruby语言融入Java项目
J Ruby和Rails 让Ruby语言融入Java项目
 
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
 
刘源 人人网服务化与架构变迁V3
刘源 人人网服务化与架构变迁V3刘源 人人网服务化与架构变迁V3
刘源 人人网服务化与架构变迁V3
 
專案分層架構 twMVC#18
專案分層架構 twMVC#18專案分層架構 twMVC#18
專案分層架構 twMVC#18
 
twMVC#18 | 專案分層架構
twMVC#18 | 專案分層架構twMVC#18 | 專案分層架構
twMVC#18 | 專案分層架構
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
基于协程的网络开发框架的设计与实现
基于协程的网络开发框架的设计与实现基于协程的网络开发框架的设计与实现
基于协程的网络开发框架的设计与实现
 
CodeIgniter 2.0.X
CodeIgniter 2.0.XCodeIgniter 2.0.X
CodeIgniter 2.0.X
 
Nodejs异步的原理和缺陷
Nodejs异步的原理和缺陷Nodejs异步的原理和缺陷
Nodejs异步的原理和缺陷
 
introduction of web 2.0
introduction of web 2.0introduction of web 2.0
introduction of web 2.0
 
Nosql七种武器之长生剑 mongodb的使用介绍
Nosql七种武器之长生剑 mongodb的使用介绍Nosql七种武器之长生剑 mongodb的使用介绍
Nosql七种武器之长生剑 mongodb的使用介绍
 

PHP 的 Web 運行原理 - 非阻塞 I/O 模式