首先,我们需要肯定的是,它的出现是为了弥补php更准确的是laravel的短板:性能和资源利用率。其次,就我们现有的场景来说,更多的是开发http的相关功能。
以上原因导致的最终结果就是响应变慢。
sdebug
,具体参考:https://segmentfault.com/a/1190000037782063git pull
就能部署,而现在需要开发人员是熟悉构建。laravel+swoole
,laravel-s
。两个框架对数据库的IO不支持协程并发。hyperf
,swoft
,easy-swoole
。八卦一下,swoft
与easy-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语言的协程调度 是抢占式调度
map[string]chan string
)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)
use
关键字引入外部变量到当前作用域禁止使用引用。Q&A
值得反复看看。