Swoole4之后,协程支持已经完善,支持大量的PHP扩展和自动协程。一些基于Swoole4的框架也百花齐放,光看文档就让人跃跃欲试。然而,如何为已有的老项目引入和启用Swoole协程,成为实际场景中的一个客观问题。由于协程和生命周期的特性,它并不像想象的那么容易。本文整理了现有项目中引入Swoole4和开启协程的一些步骤和需要注意的问题,希望能给有需要的人提供帮助。前置需求请阅读Swoole文档中环境依赖章节。本文只关注代码部分的调整。以下默认的Swoole4扩展已经编译安装成功。框架代码部分,请先查看使用的框架是否有结合Swoole的开源方案,比如laravel-s。(这样会导致框架版本难以升级)业务代码部分,先阅读Swoole文档中协程编程说明的章节。通过协程ID隔离单例对象,防止跨协程使用单例对象。对于Mysql、Redis等,连接资源需要通过defer或者closure来回收重用,防止连接数不断增加。评估全局变量和常量,根据协程ID隔离所有可能出问题的地方。对于项目中echo、print等直接输出修改位置,或者使用ob_start方法获取输出内容进行处理。修改项目中不支持自动协程的库,使用协程客户端替代。(如:卷曲)。在项目中使用exit,在die的地方进行修改。小心静态静态类、属性或变量,以及通过引用传递给协程的变量。尽量避免这种情况,只使用局部变量。对每一次修改做单元测试,并做好备份回滚措施。可以从一些单一的场景开始逐步修改。(如:单个业务模块、简单的PHP脚本等)。综上所述,上面的修改看似内容不多,但是在一个已有的项目中修改并保证服务的正常运行并不容易。希望大家慎重,早日成功。
