槽痞

当我们讨论swoole的时候,我们在讨论什么?

首先,我们需要肯定的是,它的出现是为了弥补php更准确的是laravel的短板:性能和资源利用率。其次,就我们现有的场景来说,更多的是开发http的相关功能。

为什么要使用swoole

现状

以上原因导致的最终结果就是响应变慢

swoole优势

swoole的局限性

应用方式

一个最简单的请求对比:

以前请求路径:
客户端->nginx->php-fpm fork子进程->laravel处理请求

上swoole之后:
客户端->nginx(反代,主要处理静态资源)->swoole进程->laravel处理请求

同时面临的新问题:

Does this package provide coroutine feature?
There's an experimental coroutine driver for PDO in 
this package. However, this may cause unpredictable
 errors in your app in this moment. The coroutine
 feature is a long-term plan in the roadmap. 
I can't guarantee when it will be completed though.
警告:协程下代码执行顺序是乱序的,请求级的数据应该以协程ID隔离,但
Laravel/Lumen中存在很多单例、静态属性,不同请求间的数据会相互影响,这是不安全
的。比如数据库连接就是单例,同一个数据库连接共享同一个PDO资源,这在同步阻
塞模式下是没问题的,但在异步协程下是不行的,每次查询需要创建不同的连接,维护
不同的IO状态,这就需要用到连接池。所以不要打开协程,仅自定义进程中可使用协程。

swoole的学习成本:

与go语言的一些对比:
swoole借鉴了不少golang思想。包括协程(coroutine)、并发时使用的go关键字等,但是形式上相似不一定绝对相同的。

swoole下这段代码会死锁,基于时间片调度,具体原因也在一起:

同样的代码逻辑,golang下能正常运行,原因在于go语言的协程调度
抢占式调度

Laravel的orm使用的的数据库连接是单例,而go语言的grom实现的是连接池。
当然go的连接使用也是有需要注意的,也有安全与不安全之分。

新初始化的 *gorm.DB 或调用 新建会话方法 后,GORM 会创建新的
 Statement 实例。因此想要复用 *gorm.DB,您需要确保它们处于 新建会话模
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
// db 是一个刚完成初始化的 *gorm.DB 实例,这是一个 新建会话

安全:

db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})// db 是一个刚完成初始化的 *gorm.DB 实例,这是一个 `新建会话`db.Where("name = ?", "jinzhu").Where("age = ?", 18).Find(&users)// `Where("name = ?", "jinzhu")` 是调用的第一个方法,它会创建一个新 `Statement`db.Where("name = ?", "jinzhu2").Where("age = ?", 20).Find(&users)

不安全:

db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})// db 是一个刚完成初始化的 *gorm.DB 实例,这是一个 `新建会话`tx := db.Where("name = ?", "jinzhu")tx.Where("age = ?", 18).Find(&users)tx.Where("age = ?", 28).Find(&users)

Tips

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »